2017-10-18 129 views
1

我有一系列對應於地震數據的11個大矩陣。我想在循環中從各個矩陣中繪製數據。我將使用虛擬矩陣data1和data2來說明我的問題。如何在循環中引用矩陣

load('data1'); 

load('data2'); %data1 and data2 are large matrices 

matrixname={data1 data2}; 

for j=1:2 

    matrix=matrixname(j); 

    latitude=matrix(:,1); 

    longitude=matrix(:,2); 

    geoshow(latitude,longitude); 

end 

所以在我的循環中,我想根據索引從不同的矩陣中提取列。但我無法弄清楚如何做到這一點 - 我收到錯誤消息,指出索引超出了矩陣的大小。 感謝幫助!

+0

你[用單元格數組訪問數據](https://www.mathworks.com/help/matlab/matlab_prog/access-data-in-a-cell-array.html)用'{}',而不用' ()'。因爲'matrixname'是一個單元格數組,'matrix = matrixname(j)'將返回1個單元格,而不是你的數組,所以'matrix(:,2)'將超出範圍' – excaza

回答

0

爲了讓你從一個單元陣列(這是什麼{data1 data2}是)需要的矩陣,你需要使用cell2mat()

matrix=cell2mat(matrixname(j)); 
+0

或者他可以只是用'{}'索引它。 'cell2mat'完全不需要。 – excaza

+0

很高興知道! – frslm

1

如前所述,使用{}括號電池陣列。另外,如果要將經緯度存儲到新矩陣中,則將「j」項添加到矩陣中,這樣就不會覆蓋for循環中的數據。

此外,在編寫循環時,如果您分析的文件數量發生變化,最好使用size/length/numel而不是固定變量。

所以把你的代碼;

for j=1:size(matrixname,2) 

    matrix = []; % reformat matrix in case of size differences 

    matrix = matrixname{j}; % gets the jth matrix 

    latitude(j) = matrix(:,1); % outputs column 1 

    longitude(j) = matrix(:,2); % outputs column 2 

    geoshow(latitude(j),longitude(j)); % runs function on jth set of data 

end 

請記住,[]括號用於矩陣。正如上面指出的那樣,使用錯誤的括號是給了你錯誤的。

0

由於data1和data2的是矩陣,當你:

到matrixname = {DATA1 DATA2};

你不會像你期待的那樣得到一個雙精度數組,而是一個單元陣列。沒關係,因爲data1和data2的大小不一樣(行數或列數)。

然後,在for循環中,當訪問matrixname中的一個原始矩陣(data1或data2)時,應該將其轉換回雙精度數組。最簡單和最快速的方法是:

matrix = matrixname {j};

查看與代碼的區別:我使用大括號{}而不是括號()。這樣做,矩陣是一個雙打數組。做矩陣=矩陣名(j),矩陣是一個單元陣列。

最後,清除循環內的臨時變量總是很好。然後,你的代碼應該是這樣的:

load('data1');

load('data2'); %data1和data2是大矩陣

matrixname = {data1 data2};

對於j = 1:2

matrix=matrixname{j}; 

latitude=matrix(:,1); 

longitude=matrix(:,2); 

geoshow(latitude,longitude); 

clear matrix latitude longitude 

例如,如果:

DATA1 = [1 1; 2 2; 3 3]; data2 = [10 10; 20 20; 30 30; 40 40];

matrixname = {data1 data2};

matrixname {1}爲您提供了完全data1,matrixname {2}爲您提供了data2。