2013-11-14 1 views
0

Пусть у меня есть такая матрица:Изменения диагонали матрицы, не квадратной

1 2 3 
3 2 3 
4 5 6 
7 8 9 
3 2 3 

Как добавить диагональ них в это? Есть ли простой способ? Для того, чтобы показать, что я имею в виду:

1 2 3 
3 1 3 
4 5 1 
1 8 9 
3 1 3 
+0

так что вы имеете в виду «заменить», а не «+», так? –

+0

Да, я имею в виду замену. – Paulinchen2

ответ

5

Вы можете сделать это довольно легко с linear indexing, вам даже не нужно менять форму!

[r, c] = size(m); 
m(1:c:end) = 1; 
m = 

    1  2  3 
    4  1  6 
    7  8  1 
    1 11 12 
    13  1 15 

Если r < c, это лучшее, что я получил:

if r < c 
    n = m'; 
    n(1:r:end) = 1; 
    m = n'; 
else 
    m(1:c:end) = 1; 
end 
+1

Что делать, если 'r jkshah

+0

@jkshah: Честно говоря, я не могу найти способ сделать это * и * избегать 'if', используя только линейную индексацию. Я обновил ответ. Если у вас есть лучшее предложение, * стреляйте *! =) –

+0

+1 Хорошо видно! Просто шаги 'c' –

0
s=min(size(m)) 
m(1:s,1:s)=eye(s)+(~eye(s).*m(1:s,1:s)) 
+0

Я пробовал это на m = [1,2,3; 4,5,6; 7,8,9,10,11,12,13,14,15], но заменялась только верхняя диагональ. – Paulinchen2

2

Это общее решение, используя линейную индексацию и по модулю операции:

[R C] = size(m); 
ii = 1:R; 
jj = mod(ii,C); 
jj(jj==0) = C; 
m(ii+(jj-1)*R) = 1; %// or m(sub2ind([R C],ii,jj)) = 1; 

Например,

m = 

    1  2  3 
    4  5  6 
    7  8  9 
    10 11 12 
    13 14 15 
    16 17 18 
    19 20 21 

преобразуется в

m = 

    1  2  3 
    4  1  6 
    7  8  1 
    1 11 12 
    13  1 15 
    16 17  1 
    1 20 21 
0

Если вы хотите более короткую версию без сравнения количества строк, число столбцов, вы можете попробовать это (при условии, что вы хотите чтобы диагональные элементы произвольной матрицы М были равны 1):

M(logical(speye(size(M)))) = 1