Matlab 如何告诉倍频程,索引是一个矩阵,而不是一个向量

Matlab 如何告诉倍频程,索引是一个矩阵,而不是一个向量,matlab,types,vector,matrix,octave,Matlab,Types,Vector,Matrix,Octave,当索引到具有可变维度矩阵的向量时,如何向倍频程指示索引是矩阵而不是向量 例如,在下面的代码中,在第四次迭代中,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

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

例如,在下面的代码中,在第四次迭代中,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
请注意,在前三次迭代中,答案是行向量,但在最后一次迭代中,答案是单例值


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

解决此“特征”的一种方法如下:

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/倍频程JIT在引擎盖下的功能)

我如何告诉倍频程,变量s应该是一个矩阵,而不是一个向量

在Matlab/倍频程中,矩阵和向量是一样的。向量只是一个1xm或mx1矩阵

只有当两个维度都大于1时,“求和函数维度”选项才起作用

把向量作为一个特例

for i = 4:-1:1
    s = t(1:i,:);
    if i~=1
        f(v(s))
    else
        v(s)'
    end
end

我将这个问题标记为matlab,因为我相信同样的问题也存在于matlab中,sum的维度选项始终有效(无论dims是否为1)。这不是问题所在(尽管您似乎确实发现了问题,因为当i==1时,您被迫转置v(s),这就是问题所在)。f(v(s)’应该代替你的v(s)’,但是我正在寻找一个没有条件的更优雅的解决方案。