LINUX.ORG.RU

поэлементное деление матриц с условием


0

2

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

$ cat q4lin.m 
#!/usr/bin/octave -q
a = [1 2 3; 4 5 6; 7 8 9]
r = [0 1 2; 3 0 4; 5 6 0]
x = a ./ r 

$ ./q4lin.m 
a =

   1   2   3
   4   5   6
   7   8   9

r =

   0   1   2
   3   0   4
   5   6   0

x =

      Inf   2.0000   1.5000
   1.3333      Inf   1.5000
   1.4000   1.3333      Inf

Пробую на octave, он мне ближе. Может на Python это можно сделать?


может, потом умножить поэлементно на матрицу, в которой все единицы, а по диагонали - ноль?

note173 ★★★★★
()
Ответ на: комментарий от balodja

А, я автора топика не сразу понял. Не хватает тега «хочется странного».

balodja ★★★
()
$ cat a.m 
#!/usr/bin/octave -q
a = [1 2 3; 4 5 6; 7 8 9]
r = [0 1 2; 3 0 4; 5 6 0] + eye(3)*Inf
x = a ./ r 
$ ./a.m
a =

   1   2   3
   4   5   6
   7   8   9

r =

   Inf     1     2
     3   Inf     4
     5     6   Inf

x =

   0.00000   2.00000   1.50000
   1.33333   0.00000   1.50000
   1.40000   1.33333   0.00000

Так?

balodja ★★★
()
Ответ на: комментарий от balodja

Классно!!!

Но, ситуация такая. В матричных языках использование матричных поэлементных преобразований более эффективно чем циклов (по вашей классификации «хочется странного»).

Хотелось бы найти оператор, который обрабатывает поэлементно матрицы, а определенные элементы просто не трогает (в нашем случае элементы на диагонали). Это было бы наиболее эффективно.

Кстати пример пришлось переделать.

$ cat a.m 
#!/usr/bin/octave -q
a = [1 2 3; 4 5 6; 7 8 9]
r = [0 1 2; 3 0 4; 5 6 0] + eye(3)*Inf
x = a ./ r


A = [1 2 3; 4 5 6; 7 8 9] 
A = A .- diag(diag(A))
R = [0 1 2; 3 0 4; 5 6 0] + eye(3)
X = A ./ R

$ ./a.m 
a =

   1   2   3
   4   5   6
   7   8   9

r =

   Inf   NaN   NaN
   NaN   Inf   NaN
   NaN   NaN   Inf

x =

     0   NaN   NaN
   NaN     0   NaN
   NaN   NaN     0

A =

   1   2   3
   4   5   6
   7   8   9

A =

   0   2   3
   4   0   6
   7   8   0

R =

   1   1   2
   3   1   4
   5   6   1

X =

   0.00000   2.00000   1.50000
   1.33333   0.00000   1.50000
   1.40000   1.33333   0.00000

tmfd
() автор топика
Ответ на: комментарий от tmfd

Еще есть полезные функции isfinite и ones в сочетании с size. Может они чем помогут.

balodja ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.