2015-10-12 2 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 

Я хочу, чтобы автоматизировать этот процесс на основе длины Angle:

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

Спасибо!

+0

Непонятно мне, что вы просите. Почему матрица не непрерывна? – natario

+1

Зачем вам это нужно? Это очень плохая практика и приведет только к большей головной боли в будущем. У вас есть отлично используемая матрица с разумными индексами: я предлагаю вам использовать это. – beaker

+0

Поскольку размер изменяется, это зависит от длины «Угол». Следовательно, количество выходных векторов изменяется –

ответ

2

Единственный способ динамически генерировать переменные переменных workspace имя whos создается путем объединения строковых и числовых значений (как в вашем вопросе), чтобы использовать функцию eval.

Тем не менее, eval - это только один символ, далекий от «злого», соблазнительный, как он есть, и опасный, как и он.

Возможный компромисс между непосредственно работает с cl_matrix и генерации набора массива cl_1, cl_7 и cl_15 можно было бы создавая structure Whos fields являются dynamically generated.

Вы действительно можете создать поле с struct WHOS являются cl_1, cl_7 и cl_15 таким образом:

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

(вы можете заметить, имя поля, например cl_1, генерируется таким же образом, вы можете создать его используя eval).

Используя этот подход предлагает значительное преимущество по отношению к генерации массивов с помощью eval: вы можете получить доступ к field О.Д. 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

Смежные вопросы