2015-10-12 32 views
0

我在Matlab中編寫了一個軟件。在這裏,用戶可以定義一個尺寸,例如3.向量中分割非連續大小的矩陣

該維度隨後是for循環的迭代次數。在這個循環中,我構造了一個矩陣來存儲在每次迭代過程中生成的結果。所以,每次迭代的數據都存儲在一行矩陣中。

因此,矩陣的大小取決於循環的大小以及用戶輸入。

現在,我要分開這個矩陣(cl_matrix)的每一行和每一行自動生成不同的載體。如何繼續下去?我至今堅持在這裏......

我:

Angle = [1 7 15]; 
for i = 1:length(Angle) 
    %% do some calculations here %% 
    cl_matrix(i,:) = A.data(:,7); 
end 

我想基於角的長度,自動完成:

length(Angle) 
cl_1 = cl_matrix(1,:); 
cl_7 = cl_matrix(2,:); 
cl_15= cl_matrix(3,:); 

謝謝!

+0

不清楚你在問什麼。爲什麼矩陣不連續? – natario

+1

你爲什麼要這麼做?這是非常糟糕的做法,只會導致未來更令人頭痛。你有一個完美可用的矩陣,具有明智的索引:我建議你使用它。 – beaker

+0

由於尺寸變化,它取決於「角度」的長度。因此,輸出矢量的量變化 –

回答

2

workspace變量中動態生成變量的唯一方法是使用eval函數通過彙總字符串和數字值構建名稱(如您的問題)。

儘管如此,eval是隻有一個字符遠離「邪惡」的,誘人的,因爲它是和危險的,因爲它是爲好。

之間與cl_matrix直接工作,併產生所述一組陣列cl_1cl_7cl_15可以創建一個structure衛生組織fieldsdynamically generated一種可能的折衷。

實際上,你可以生成一個struct衛生組織場均cl_1cl_7cl_15這樣:

cl_struct.(['cl_' num2str(Angle(i))])=cl_matrix(i,:) 

(您可能會注意到的字段名稱,如cl_1,你可以通過生成同樣的方式產生使用eval)。

使用這種方法通過使用eval提供了一個顯着的優勢,相對於陣列的一代:您可以訪問到field OD的struct(也就是他們的內容),甚至不知道他們的名字。

在下面,你可以在其中找到這種方法已經實現你的腳本的修改版本。

腳本生成兩個結構:

  • 第一個,cl_struct_same_length用於存儲的cl_matrix
  • thesecond一個行,cl_struct_different_length用於不同長度的存儲陣列

在腳本中有關於如何訪問文件(即數組)以執行一些計算的示例(在該示例中,用於評估每個文件的mean)。

您可以通過使用功能接入到結構域:

  • getfield得到的值存儲在它
  • fieldnames獲取字段的名稱(動態生成的)

更新的腳本

Angle = [1 7 15]; 
for i = 1:length(Angle) 
    % do some calculations here %% 
% % % cl_matrix(i,:) = A.data(:,7); 
    % Populate cl_matrix 
    cl_matrix(i,:) = randi(10,1,10)*Angle(i); 
    % Create a struct with dinamic filed names 
    cl_struct_same_length.(['cl_' num2str(Angle(i))])=cl_matrix(i,:) 
    cl_struct_different_length.(['cl_' num2str(Angle(i))])=randi(10,1,Angle(i)) 
end 
% Use "fieldnames" to get the names of the dinamically generated struct's field 
cl_fields=fieldnames(cl_struct_same_length) 
% Loop through the struct's fileds to perform some calculation on the 
% stored values 
for i=1:length(cl_fields) 
    cl_means(i)=mean(cl_struct_same_length.(cl_fields{i})) 
end 
% Assign the value stored in a struct's field to a variable 
row_2_of_cl_matrix=getfield(cl_struct_different_length,(['cl_' num2str(Angle(2))])) 

希望這有助於。

+1

「eval」與「邪惡」之間的好比喻 – hbaderts