matlab: представляет данные 1 столбца в данные 3 столбцов - PullRequest
0 голосов
/ 02 июля 2011
if 1st column detect 1, then add  1 -1 -1 to 2nd to 4th column 
if 1st column detect 2, then add -1  1 -1 to 2nd to 4th column 
if 1st column detect 3, then add -1 -1  1 to 2nd to 4th column 

пример: матрица 5x1

A=
1
2
3
2
1

Я хотел бы получить результат, как показано ниже: Матрица становится 5х4

A =
1  1 -1 -1
2 -1  1 -1
3 -1 -1  1
2 -1  1 -1
1  1 -1 -1

код, который я написал ниже, не может получить вышеуказанный результат, пожалуйста, помогите ...

if A(1:end,1) == 1
   A(1:end,2:4) = [1 -1 -1]
else if A(1:end,1) == 2
   A(1:end,2:4) = [-1 1 -1]
else 
   A(1:end,2:4) = [-1 -1 1]
end

Ответы [ 3 ]

2 голосов
/ 02 июля 2011

Вы можете просто использовать индексацию:

V = [
  1 -1 -1    %# rule 1
 -1  1 -1    %# rule 2
 -1 -1  1    %# rule 3
];

A = [1;2;3;2;1];

newA = [A V(A,:)];

Результат:

newA =
     1     1    -1    -1
     2    -1     1    -1
     3    -1    -1     1
     2    -1     1    -1
     1     1    -1    -1
0 голосов
/ 02 июля 2011

Это должно дать вам представление

>>> A= [1 2 3 2 1; zeros(3, 5)]';
>>> m= 1== A(:, 1); A(m, 2: 4)= repmat([ 1 -1 -1], sum(m), 1);
>>> m= 2== A(:, 1); A(m, 2: 4)= repmat([-1  1 -1], sum(m), 1);
>>> m= 3== A(:, 1); A(m, 2: 4)= repmat([-1 -1  1], sum(m), 1);
>>> A
A =
   1   1  -1  -1
   2  -1   1  -1
   3  -1  -1   1
   2  -1   1  -1
   1   1  -1  -1

о том, как довольно просто внедрить этот тип функциональности в ваш код.

Например, как

>>> A= [1 2 3 2 1; zeros(3, 5)]';
>>> I= [1 -1 -1; -1 1 -1; -1 -1 1];
>>> for k= 1: size(I, 1)
  >    m= k== A(:, 1); A(m, 2: 4)= repmat(I(k, :), sum(m), 1);
  > end

Или даже более компактно, как

>>> A= [1 2 3 2 1; zeros(3, 5)]';
>>> I= [1 -1 -1; -1 1 -1; -1 -1 1];
>>> A= [A(:, 1) I(A(:, 1), :)]
A =
   1   1  -1  -1
   2  -1   1  -1
   3  -1  -1   1
   2  -1   1  -1
   1   1  -1  -1

Что действительно говорит о том, что многие операции Matlab, очевидно, нуждающиеся в repmat, действительно могут быть обработаны с помощью некоторой «умной» схемы индексации.

0 голосов
/ 02 июля 2011

Во-первых, вы сравниваете целые числа с векторами в ваших if утверждениях. Это не сработает. Вам нужно перебрать весь вектор, проверяя каждый элемент отдельно. Также предпочтительно предварительно выделить матрицу результатов перед ее изменением, так как выделение является дорогостоящей операцией:

A = [A zeros(size(A,1), 3)];
for i=1:size(A,1)
    if(A(i,1) == 1)
        A(i,2:4) = [1 -1 -1];
    elseif(A(i,1) == 2)
        A(i,2:4) = [-1 1 -1];
    elseif(A(i,1) == 3)
        A(i,2:4) = [-1 -1 1];
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...