Как преобразовать этот код Octave / Matlab в Python 3.7.4? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть некоторый рабочий код Octave / Matlab, который я пытаюсь заставить работать / преобразовать в Python 3.7.4, поэтому я могу использовать его в Blender 2.82, который использует Python 3.7.4 .

Рабочий код Octave / Matlab:

c=[7,-2,-4,-8]

[rw col]= size(c); %get size a array

num_of_loops=5 %number of loops to iterate
a= zeros(num_of_loops,col); %allocate memory to array
b= zeros(1,(rw*col)); %allocate memory to array

a(1,:)=c; %add c array to 1st row in array 

for n=1:num_of_loops
  n
  a = c .+ [c(end).*(0:4)].'; 
  b = vec (a.', 2);
endfor

b=reshape(a',1,[]);

Что дает мне правильный вывод:

c= 
7   -2  -4  -8

a=
 7  -2  -4  -8
-1  -10 -12 -16
-9  -18 -20 -24
-17 -26 -28 -32
-25 -34 -36 -40

b=
7   -2  -4  -8  -1  -10 -12 -16 -9  -18 -20 -24 -17 -26 -28 -32 -25 -34 -36 -40 

( Если вам нужен if / then / else команды вот оригинальный вопрос .)

Я попробовал онлайн конвертировать октаву / матрицу в python конвертер , и это дает мне код ниже (который не полностью работает). Как я могу исправить код Python 3.x, чтобы он работал в Blender 2.82, который использует Python 3.7.4?

c = mcat([7, -2, -4, -8]); print c

[rw, col] = size(c)#get size a array

num_of_loops = 5; print num_of_loops#number of loops to iterate
a = zeros(num_of_loops, col)#allocate memory to array
b = zeros(1, (rw * col))#allocate memory to array

a(1, mslice[:]).lvalue = c#add c array to 1st row in array

for n in mslice[1:num_of_loops]:
    n()
    mcat([c(end) *elmul* (mslice[0:4])]).T
    b = vec(a.T, 2)
    end

    b = reshape(a.cT, 1, mcat([]))

1 Ответ

1 голос
/ 17 февраля 2020

Данный код MATLAB / Octave можно свернуть (см. Также комментарий к вашему предыдущему вопросу ) до:

c = [7, -2, -4, -8]
a = c .+ [c(end).*(0:4)].'
b = vec(a.', 2)

Соответствующий вывод:

c =
   7  -2  -4  -8

a =
    7   -2   -4   -8
   -1  -10  -12  -16
   -9  -18  -20  -24
  -17  -26  -28  -32
  -25  -34  -36  -40

b =
    7 -2 -4 -8 -1 -10 -12 -16 -9 -18 -20 -24 -17 -26 -28 -32 -25 -34 -36 -40

Код MATLAB / Octave можно легко перенести в Python, используя NumPy. На «NumPy для пользователей MATLAB» есть много ресурсов, которые можно найти в Интернете, например, этот от самих разработчиков.

Мое решение будет выглядеть так:

import numpy as np

c = np.array([[7, -2, -4, -8]])
a = c + (np.expand_dims(c[0][-1] * np.arange(5), 1))
b = a.reshape(1, np.prod(a.shape))

# Just for console output 
print('c = ')
print(c, '\n')
print('a = ')
print(a, '\n')
print('b = ')
print(b, '\n')

Вывод этого кода:

c = 
[[ 7 -2 -4 -8]] 

a = 
[[  7  -2  -4  -8]
 [ -1 -10 -12 -16]
 [ -9 -18 -20 -24]
 [-17 -26 -28 -32]
 [-25 -34 -36 -40]] 

b = 
[[  7 -2 -4 -8 -1 -10 -12 -16 -9 -18 -20 -24 -17 -26 -28 -32 -25 -34 -36 -40]] 

Вы должны проверить, поддерживается ли NumPy в вашей среде. Если нет, я бы предположил, что решение может стать намного более сложным.

Надеюсь, это поможет.

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
Octave:      5.1.0
----------------------------------------
...