簡體   English   中英

如何告訴倍頻程索引是一個矩陣,而不是一個向量

[英]How to tell octave that the index is meant to be a matrix, not a vector

當索引具有可變尺寸矩陣的向量時,如何指示八度索引是矩陣而不是向量?

例如,在下面的代碼中,在第四次迭代中,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形狀相同?

解決此“功能”的一種方法是這樣的:

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在幕后做了什么?

如何告訴八度,變量s應該是矩陣,而不是向量

在Matlab / Octave中,矩陣和矢量是同一回事。 向量只是一個1xm或mx1矩陣。

總和函數維選項僅在兩個維都大於1時才有效。

只是使vector成為特例。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM