簡體   English   中英

matlab:了解matlab行為

[英]matlab: understanding matlab behavior

有人可以解釋以下代碼段嗎? 我沒有計算機科學或編程方面的背景,只是最近才意識到Matlab。 我了解預分配部分從data=ceil(rand(7,5)*10)......N*(N-1)/2)

我需要了解matlab如何處理從kk=0到最后的代碼的各個方面。 同樣,以這種方式將代碼編碼的原因。 無需解釋bsxfun(@minus) ,只需解釋其在代碼方案中的工作方式即可。

data=ceil(rand(7,5)*10); 
N = size(data,2);
b=cell(N-1,1);
c=NaN(size(data,1),N*(N-1)/2); 

kk=0;
for ii=1:N-1
    b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
    c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
    kk=kk+N-ii;
end

從零開始

kk=0; 

ii的循環從1到N-1每次迭代遞增1。 在matlab命令行中輸入1:10 ,您會看到它輸出1 2 3 4 5 6 7 8 9 10 Thuis冒號運算符是在matlab中了解的非常重要的運算符。

for ii=1:N-1 

b {ii} = ...這僅將矩陣存儲在單元向量b的下一個元素中。 單元數組可以在其每個元素中保存任何內容,這是必需的,因為在這種情況下,每次迭代創建的矩陣都比前一次迭代少一列。 data(:,ii)->僅獲取矩陣數據的第i列(:表示獲取所有行)data(:, ii + 1:end)表示獲取由所有行組成的矩陣數據的子集,但僅出現在列ii之后的列bsxfun(@minus,data(:,ii),data(:,ii + 1:end))->對於矩陣data(:, ii + 1:end)中的每一列,減去單列數據(:,ii)

b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));

%這與上面的行具有相同的作用,但是不是將循環的結果矩陣存儲在單元格數組的單獨單元格中,而是將原始數組附加到新矩陣中。 請注意,新矩陣每次將具有相同的行數,但列數減少了,因此將作為新列追加。 %c(:,kk +(1:N-ii))= ....->所以1::( N-ii)產生數字1直至此迭代結果中的列數。 在matlab中,您可以使用另一個數組為數組建立索引。 因此,例如,在matlab的命令行中嘗試以下操作: a = [0 0 0 0 0]; a([1 3 5]) = 1 a = [0 0 0 0 0]; a([1 3 5]) = 1 您應該看到的結果是a = 1 0 1 0 1 但您也可以像這樣擴展矩陣,例如現在輸入a(6) = 2 結果: a = 1 0 1 0 1 2 因此,通過使用c(:, 1:N-ii),我們可以索引c的所有行以及正確的列數(按順序)。 添加kk只是抵消了它,因此我們不會覆蓋以前的結果。

c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));

現在,我們只是將kk增加所添加的新列的數量,以便在下一次迭代中,將c添加到末尾。

kk=kk+N-ii;
end;

我建議您在此代碼中放置一個斷點,並逐行處理它,並查看變量在matlab中的變化。 為此,請單擊k=0;旁邊的虛線k=0; 在mfile中,您將看到一個紅點出現在其中,然后運行代碼。 該代碼僅會執行到點為止,您現在處於調試模式。 如果在調試模式下將鼠標懸停在變量上,則matlab將在工具提示中顯示其內容。 對於很大的變量,請在工作區中檢查出來。 現在逐行瀏覽代碼,並使用上面的解釋確保您了解每一行如何更改每個變量。 對於更復雜的行,例如b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end)); 您應該突出顯示代碼段並在命令行中破壞它們,以查看每個部分的操作,例如,運行data(:,ii)以查看其功能,然后嘗試data(:,ii+1:end))甚至只是ii+1:end (在這種情況下,它將無法工作,請用size(data,2)替換end)。 調試是理解使您感到困惑的代碼的最佳方法。

bsxfun(@minus,A,B)

幾乎與

A-B

區別在於bsxfun版本將處理不同大小的輸入:在每個維度(“方向”,如果您覺得這樣更容易思考),如果其中一個輸入是標量,而另一個輸入是矢量,則為標量簡單地重復一次就足夠了。

http://www.mathworks.com/help/techdoc/ref/bsxfun.html

暫無
暫無

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

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