«Умножение» массивов в MATLAB

Во-первых, я не знал, что поставить в качестве заголовка, так как вопрос не так просто сформулировать кратко.

Мне нужно свернуть матричную функцию (k) с векторной функцией (X), каждая из которых определена на R ^ 3. Мне нужно сделать это в MATLAB, поэтому, естественно, я сделаю дискретизированную версию. Я планирую представлять k и X 5- и 4-мерными массивами соответственно. Хотя это кажется немного тяжелым. Знаете ли вы, есть ли лучшие способы сделать это?

Вместо того, чтобы выполнять свертку напрямую, я перейду к пространству Фурье, fft используя k и X, дополнив нулями, умножив их, а затем используя ifft. Это должно дать тот же результат и работать намного, намного быстрее.

Мой вопрос здесь в том, есть ли способ легко умножить эти массивы/матрицы? т.е. есть ли способ сделать k(i,j,k,:,:)*X(i,j,k,:) для всех i, j, k без использования трех вложенных циклов?


person torbonde    schedule 30.10.2012    source источник


Ответы (2)


Вам нужна дискретизация? Matlab вполне способен принимать функции в качестве входных и выходных данных. Например, вы можете определить функцию свертки:

>> convolve = @(fm,fv) @(x) fm(x) * fv(x); %fm matrix valued, fv vector valued

и определить некоторые матричные и векторные функции (предполагается, что вход является вектор-столбцом)

>> f = @(x) [x x x];
>> g = @(x) cos(x);

теперь их свертка:

>> h = convolve(f,g);

и попробуйте применить его к вектору:

>> h([1;2;3])
ans =
   -0.8658
   -1.7317
   -2.5975

Вы получите такой же ответ, как если бы вы проделали операцию вручную:

>> f([1;2;3]) * g([1;2;3])
ans =
   -0.8658
   -1.7317
   -2.5975
person Chris Taylor    schedule 30.10.2012
comment
Боюсь, мне придется это сделать, так как на самом деле мне нужно свернуть матричную функцию со стохастическим процессом с векторным знаком. Я не знаю, но я предполагаю, что стохастические процессы нелегко обрабатывать в MATLAB без дискретизации. - person torbonde; 30.10.2012

Вы выполняете поэлементную операцию с помощью . вместе с выбранным оператором. Например:

Element-by-element multiplication: .* 
Element-by-element division: ./

и так далее... ты это имеешь в виду?

person Fredrik    schedule 30.10.2012
comment
Нет, я это знаю. То, что мне нужно, больше похоже на поэлементное умножение матриц, если это имеет смысл? В приведенном выше k(i,j,k,:,:) будет матрицей, а X(i,j,k) будет вектором. Мне нужно умножить их для каждого i, j и k. - person torbonde; 30.10.2012
comment
Я вижу, вы пытались использовать метод conv2 в MATLAB? Вы уверены, что переход в частотную область и обратно происходит быстрее? - person Fredrik; 30.10.2012
comment
Я еще не пробовал циклическое решение, которое мне нужно, чтобы увидеть, действительно ли оно быстрее. Так что нет, на самом деле нет. Тем не менее, я попробовал свертку против поточечного умножения в пространстве Фурье с двумя 4-мерными массивами (размер 600 x 20 x 20 x 3 или что-то в этом роде). Свертка заняла ~ 5,5 секунды, тогда как версия умножения заняла всего ~ 0,5 секунды. Я подозреваю, что то же самое поведение будет отображаться с матричным мультиплакцией. Особенно, когда позже мне понадобятся еще большие массивы. - person torbonde; 30.10.2012