2015-12-26 2 views
1

У меня есть моя матрица «А» которым пользователь определить его размер, например, пользователь определить размер 3x5 для матрицы A:Преобразовать строку матрицы в вектор

[1 2 3 4 5] 
A= [2 4 6 8 3] 
    [2 4 5 7 8] 

Мне нужно преобразовать строки в новые векторы, как это:

A1=[1 2 3 4 5] 
A2=[2 4 6 8 3] 
A3=[2 4 5 7 8] 

Но проблема в том, что, поскольку пользователь может изменить размер матрицы (добавление/удаление строк), мне нужно взять векторы. Например, пользователь определить новый размер матрицы А как 5х5, так что мне нужно

A1=[...] 
A2=[...] 
... 
A5=[...] 

Я не хотел бы, чтобы вручную поместить новые векторы, так как число строк может стать слишком большим (около 500 или более) и поместить каждый новый вектор вручную, становится практически невозможным. Поэтому мне нужно, чтобы MatLab делал это автоматически.

У меня есть матрица, и мне нужны строки, но каждая строка должна быть вектором, потому что мне нужно вычислить каждый вектор отдельно.

У меня есть этот пример кода

dim=5;   % Define by User 
dim1=15*dim; 

A=[]; 
B=[]; 
x=round(rand(dim1)); 

for i=1:dim 
    A(i,1)=x(i); 
end 

for i=1:dim1 
    B(i,1)=x(i+1); 
end 

B=vec2mat(B,15); 

У меня есть матрица B, но мне нужно взять свои ряды в отдельно векторов:

B1= B(1,:) 
B2= B(2,:) 
... 
B5=B(5,:) 

Проблема заключается в том, что тусклый может быть 500 или более, и писать так много векторов вручную очень сложно. Поэтому мне нужна помощь в выполнении цикла.

---------------- EDIT --------------

Проблема заключается в следующем:

Пользователь определим матрицу, например:

[1 2 3 4 5] 
A= [2 4 6 8 3] 
    [2 4 5 7 8] 

Таким образом, программа должна показать мне строки в разных векторах

A1=[1 2 3 4 5] 
A2=[2 4 6 8 3] 
A3=[2 4 5 7 8] 

Если пользователь дает мне другую матрицу

[1 2 3 4 5] 
    [2 4 6 8 3] 
A= [2 4 5 7 8] 
    [4 5 6 6 7] 
    [8 2 3 3 1] 

Программа должна показать мне

A1=[1 2 3 4 5] 
A2=[2 4 6 8 3] 
A3=[2 4 5 7 8] 
A4=[4 5 6 6 7] 
A5=[8 2 3 3 1] 

Диапазон строк матрицы, которые пользователь определяют между 30 и 1200. Таким образом, мне нужно, что MatLab сделать векторы каждой строки автоматический.

Я попытался определить каждый вектор таким образом:

AA = sym('A%d', [rows 1]); 

Так что у меня A1, A2, A3, и т.д. ... и, после этого, я мог бы сделать (для последнего примера)

A1=[1 2 3 4 5] 
A2=[2 4 6 8 3] 
A3=[2 4 5 7 8] 
A4=[4 5 6 6 7] 
A5=[8 2 3 3 1] 

Но, я не знаю, как сделать этот цикл.

Спасибо

+3

* Зачем вам это нужно? Вы можете передавать строки любой функции, которая вам нужна, с использованием двоеточия, нет причин отделять их на уникальные переменные. – excaza

+3

Nonononono ... Почему бы вам создать 500 новых переменных, если 'A (1, :)' отлично исправна? И проще контактировать. – beaker

+0

Я отредактировал вопрос, поэтому, надеюсь, я правильно сформулировал свою точку зрения. –

ответ

0

Единственный способ присвоения переменных с другим именем, чтобы использовать команду Eval или assignin. Использование либо, как правило, указывает на плохую практику программирования (но это связано с вашей постановкой проблемы - ее можно решить только с помощью этих двух команд). Если вы действительно настаивают на создании отдельных переменных с разными названиями, я бы предпочел assignin подход здесь:

for ii=1:size(A,1) 
    assign(['A' num2str(ii)], A(ii,:)); 
end 

со следующим кодом, помещенного в assign.m файле

function assign(varname, val) 
assignin('caller', varname, val); 

BTW: A (немного) очиститель решение (которое не полагается на eval и assignin) было бы использовать структуру. то есть

S = struct; 
for ii=1:size(A,1) 
    S.(['A' num2str(ii)]) = A(ii,:); 
end 

который теперь содержит S.A1, S.A2 и т. д.