2

可変次元の行列を使用してベクトルにインデックスを付ける場合、インデックスがベクトルではなく行列であることをオクターブに示すにはどうすればよいですか?

たとえば、次のコードでは、4 回目の反復で、Octave はインデックスを行ベクトルと見なし、インデックス操作の戻り値を列ベクトルに転置します (使用されたベクトルではなく、インデックスが作成されたベクトルに一致させるため)。索引付け用)。

私が実行すると:

v = rand(16,1);

t = magic(4);

f = @(m)(sum(m, 1));

for i = 4:-1:1
    s = t(1:i,:);
    f(v(s))
endfor

私は得る:

ans =

   1.47780   2.28879   1.29786   2.98981

ans =

   1.24705   1.31940   0.87484   2.18276

ans =

   0.89387   0.55288   0.50312   1.61950

ans =  1.9294

最初の 3 回の反復では答えが行ベクトルですが、最後の反復では答えがシングルトン値であることを確認してください。

変数 s がベクトルではなく行列であること、およびインデックス操作の結果が常に s と同じ形状であることを octave に伝えるにはどうすればよいですか?

4

2 に答える 2

1

この「機能」を回避する 1 つの方法は、次のようなものです。

v = rand(16,1);
t = magic(4);
f = @(m)(sum(m, 1));

for i = 4:-1:1
    w(1:i,:) = v(t(1:i,:));
    f(w(1:i,:))
end

これにより、 の出力が適切な向きでv格納されます。逆インデックスループのためだけではなく、関数wに渡すことに注意してください。w(1:i,:)fwfor

これは驚くべき一般的なパターンであり、転置を実行したり、ベクトルの方向を知る必要なく、行列の列を行ベクトルに等しくしたり、行列の行を列ベクトルに等しく設定したりする便利な方法です ( Matlab/Octave JIT がフードの下で行うことを知っている人)。

于 2013-07-16T17:57:25.073 に答える
0

変数 s がベクトルではなく行列であることをオクターブに伝えるにはどうすればよいですか

Matlab/Octave では、行列とベクトルは同じものです。ベクトルは単なる 1xm または mx1 行列です。

合計関数次元オプションは、両方の次元が 1 より大きい場合にのみ機能します。

ベクトルを特殊なケースにするだけです。

for i = 4:-1:1
    s = t(1:i,:);
    if i~=1
        f(v(s))
    else
        v(s)'
    end
end
于 2013-07-16T18:16:47.167 に答える