2012-01-23 3 views
0

У меня есть матрица MATLAB с двумя столбцами, в которой я хотел бы применять отдельные функции к каждому столбцу. В частности, я хочу добавить 5 к одному столбцу и 3 к другому.Применение различных функций для разных столбцов матрицы

Например,

a = 0 4 
    2 5 
    3 7 
    . . 
    . . 
    . . 

станет

a = 5 9 
    7 10 
    8 12 
    . . 
    . . 
    . . 

Я знаю, что могу добавить такое же значение и к колонке с простым a = a + x, но в этом случае я пытаюсь назначить разные номера для добавления в каждую сторону.

+1

вы, вероятно, имели в виду: «станет {5 7} , {7 8}, {8 10}. . – james

+0

@CaptainProg: Почему бы не принять более общее решение, которое уже было встроено в matlab и, следовательно, быстрее? – tim

ответ

4

Вы можете легко добавить номера, как следующее:

a = ones(5, 2) 
b = [2 5] 
c = bsxfun(@plus, a, b) 

который даст вам:

a = 
    1  1 
    1  1 
    1  1 
    1  1 
    1  1 

b = 
    2  5 

c = 
    3  6 
    3  6 
    3  6 
    3  6 
    3  6 

bsxfun также предлагает гораздо больше операций, смотрите здесь: http://www.mathworks.de/help/techdoc/ref/bsxfun.html

0

Вы могут сделать это как ниже

a(:,1)=a(:,1)+5; 
a(:,2)=a(:,2)+3; 

Edit: Более общий код: D

function [Result]=AddColumn(A, B) 
    [aRows aCols]=size(A); 
    [bRows bCols]=size(B); 

    if(aCols~=bCols || bRows>1) 
     ErrorMessage='not Matched' 
     return; 
    end; 

    B=B' 
    X=B*ones(1,aRows); 
    X=X'; 
    Result=A+X; 
end 
+2

Не будет приятным стилем программирования для более некоторых столбцов, что можно сделать довольно просто с помощью bsxfun, который вероятно, даже быстрее для огромных чисел :) – tim

+2

Согласен, BSXFUN - это путь вперед для такого рода вещей. Позор, у него есть такое неочевидное имя, и занимает довольно большое (ИМХО) привыкание. – Edric

+0

@ColHeather см. мой раздел «Редактировать» для более общей опции –

1

Другой способ сделать это, используя на этот раз repmat:

>> a = [0 4; 2 5; 3 7; 1 2] 

a = 

0  4 
2  5 
3  7 
1  2 

>> a = a + repmat([5, 3], size(a, 1), 1) 

a = 

5  7 
7  8 
8 10 
6  5 
Смежные вопросы