Создать серию матриц из данных, содержащихся в одной матрице

Я пытаюсь создать серию матриц из данных, содержащихся в заранее определенной матрице.

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

Затем пользователь должен ввести 4 элемента для каждой указанной им строки, что создаст матрицу размером k x 4.

То есть, если пользователь выбирает 3 строки, он вводит x1, x2, x3, x4 для строки 1, а затем y1, y2, y3, y3 для строки 2, а затем z1, z2, z3, z4 для строки три, следовательно, матрица создана становится: J = [x1,x2,x3,x4;y1,y2,y3,y3;z1,z2,z3,z4].

Моя проблема в том, что мне нужно получить данные из матрицы J, чтобы создать серию новых матриц. Количество новых матриц зависит от количества строк, из которых состоит матрица J, т.е. если матрица J имеет 5 строк, то мне нужно создать 5 новых матриц из данных, содержащихся в матрице J, например T1, T2, T3, T4, Т5.

Для вновь созданных матриц (T) требуются такие элементы из матрицы J:

T1 = [cos(J(1,1)), -cos(J(1,4))*sin(x(1,1)), sin(J(1,4))*sin(J(1,1)),J(1,3)*cos(J(1,1));
     sin(J(1,1)), cos(J(1,4))*cos(J(1,1)), -sin(J(1,4))*cos(J(1,1)),J(1,3)*sin(J(1,1));
     0,sin(J(1,4)),cos(J(1,4)),J(1,2);
     0,0,0,1]; 

А потом,

T2 = [cos(J(2,1)), -cos(J(2,4))*sin(x(2,1)), sin(J(2,4))*sin(J(2,1)),J(2,3)*cos(J(2,1));
     sin(J(2,1)), cos(J(2,4))*cos(J(2,1)), -sin(J(2,4))*cos(J(2,1)),J(2,3)*sin(J(2,1));
     0,sin(J(2,4)),cos(J(2,4)),J(2,2);
     0,0,0,1];

Эта процедура продолжается до тех пор, пока не будут созданы все Т-матрицы.

Это мой код на данный момент:

function EE582_ASSIGNMENT2_Q4()

k = input('Enter the number of link and joint parameters, k: ');

x = zeros(k,4);


for n = 1:k
    disp(['Row: ', num2str(n)])
    fprintf('Arrange the Kinematic Parameters in the following syntax: [theta_%d,d_%d,l_%d,alpha_%d]\n',n,n,n,n);
    x(n,:) = input('Enter the Parameters: ');

    for v = 1:k 
        T{v} = [cos(x(v,1)), -cos(x(v,4))*sin(x(v,1)), sin(x(v,4))*sin(x(v,1)),x(v,3)*cos(x(v,1));
                sin(x(v,1)), cos(x(v,4))*cos(x(v,1)), -sin(x(v,4))*cos(x(v,1)),x(v,3)*sin(x(v,1));
                0,sin(x(v,4)),cos(x(v,4)),x(v,2);
                0,0,0,1]
    end

end

person Harpreet Lota    schedule 29.11.2014    source источник
comment
В чем проблема с вашим кодом? Какие ошибки вы получаете?   -  person Trojanian    schedule 30.11.2014
comment
Когда я запускаю код, я получаю следующий вывод в командном окне: >> EE582_ASSIGNMENT2_Q4 Enter the number of link and joint parameters, k: 1 Row: 1 Arrange the Kinematic Parameters in the following syntax: [theta_1,d_1,l_1,alpha_1] Enter the Parameters: [45,60,0,pi/2] T = [4x4 double] >> поэтому может показаться, что создается матрица 4x4 T, но я не знаю, что в ней. тем не менее, я адаптировал свой код, который, похоже, работает с использованием функции EVAL, но, похоже, нет простого метода использования T-матриц позже для различных операций.   -  person Harpreet Lota    schedule 01.12.2014
comment
Модифицированный код, который я упомянул в конце моего предыдущего комментария, находится здесь: function test_q() k = input('Enter the number of link and joint parameters, k: '); x = zeros(k,4); T = zeros(); for n = 1:k disp(['Row: ', num2str(n)]) fprintf('Arrange the Kinematic Parameters in the following syntax: [theta_%d,d_%d,l_%d,alpha_%d]\n',n,n,n,n); x(n,:) = input('Enter the Parameters: '); end for n = 1:k eval(sprintf('T%d = [cos(x(n,1)*(pi/180)), .....', n)); end end   -  person Harpreet Lota    schedule 01.12.2014
comment
Вы проверили ответ?   -  person Trojanian    schedule 05.12.2014


Ответы (1)


Я бы, наверное, поступил иначе - почему бы не использовать ваш x в качестве входного параметра функции? Тогда позвони T = {FUNCTION NAME}(x)?

Но, следуя вашему маршруту, это должно сработать:

function [T] = EE582_ASSIGNMENT2_Q4()

k = input('Enter the number of link and joint parameters, k: ');

x = zeros(k,4);


for n = 1:k
  disp(['Row: ', num2str(n)])
  fprintf('Arrange the Kinematic Parameters in the following syntax: [theta_%d,d_%d,l_%d,alpha_% d]\n',n,n,n,n);
  x(n,:) = input('Enter the Parameters: ');
end
for v = 1:k 
  T{v} = [cos(x(v,1)), -cos(x(v,4))*sin(x(v,1)), sin(x(v,4))*sin(x(v,1)),x(v,3)*cos(x(v,1));
          sin(x(v,1)), cos(x(v,4))*cos(x(v,1)), -sin(x(v,4))*cos(x(v,1)),x(v,3)*sin(x(v,1));
          0,sin(x(v,4)),cos(x(v,4)),x(v,2);
          0,0,0,1];
end

Ваши проблемы были с переменными цикла. Синтаксис, необходимый для вызова этой функции: T = EE582_ASSIGNMENT2_Q4, где T может быть любым именем переменной, которое вы хотите.

person Trojanian    schedule 01.12.2014