2

当索引到具有可变维度矩阵的向量时,我如何指示八度索引是矩阵而不是向量?

例如,在下面的代码中,在第四次迭代中,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

看到在前三次迭代中,答案是行向量,但在最后一次迭代中,答案是单例值。

如何告诉 octave 变量 s 应该是矩阵,而不是向量,并且索引操作的结果应该始终与 s 具有相同的形状?

4

2 回答 2

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,:)给函数f,而不仅仅是w因为您的反向索引for循环。

这是一种令人惊讶的常见模式,并且是一种重复设置矩阵的列等于行向量或矩阵的行等于列向量的有用方法,而无需执行转置甚至知道向量的方向(谁知道 Matlab/Octave JIT 在幕后所做的)。

于 2013-07-16T17:57:25.073 回答
0

如何告诉 octave 变量 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 回答