2013-07-16 23 views
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八度?

+0

我標記這個問題,MATLAB,因爲我相信在Matlab中存在相同的問題,以及爲 – dspyz

回答

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在底層做了什麼)。

0

我如何告訴變量s應該是一個矩陣,而不是一個向量

在Matlab中/八度矩陣和矢量倍頻是同樣的事情。矢量只是一個1xm或mx1矩陣。

SUM函數尺寸選項只有當兩個尺寸大於1

只是要矢量一個特例作品。

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

總和的尺寸選項始終作品(DIMS是否1與否)。這是沒有問題的(雖然看起來你沒有找出問題,因爲你被迫轉V(S)當我== 1這是這是怎麼一回事)。 f(v(s)')應該代替你的v(s)',但我正在尋找一個沒有條件的更優雅的解決方案。 – dspyz

相關問題