2013-09-04 5 views
1

Я создал массив ячеек function_ handles, как показано ниже:Матрица умножения массив ячеек функции ручки

B = {@(x) x(1)+x(2)^2 
    @(x) x(1)-2*x(2)} 

A = [1 2; 3 4] Предположим. Мне нужно, чтобы выполнить умножение матриц, как A*B иметь массив ячеек в качестве

A*B = {@(x) x(1)+x(2)^2 + 2*(x(1)-2*x(2)) 
     @(x) 3*(x(1)+x(2)^2) + 4*(x(1)-2*(x(2))} 

Как я могу это сделать?

+0

Что вы на самом деле хотите, это символическая панель инструментов. – Peter

ответ

0

Там нет другого пути, кроме:

  1. писать свой собственный class, который поддерживает multplications и/или дополнения function_handles и doubles
  2. превращающего все в строку, манипулируя строки и преобразовать обратно в функцию ручки (см замечательный вариант Мохсен придумал)
  3. не на самом деле создатьA*B, а скорее просто оценить его (только вычислить A*cellfun(@(f)f(y),B) для некоторых y)
  4. Вручную скопировать вставки выражения
  5. ... что-то еще, несомненно, уродливое.

Просто из любопытства, не могли бы вы объяснить, почему вам нужна эта операция?

+0

Вы знаете, что я собираюсь решить систему нелинейных уравнений AB (X) = X. X = {x1, x2, ..., xn} - вектор n-dim, а B (X) - вектор одинаковое сглаживание в каждой из ее строк нелинейное уравнение в терминах {x1, x2, ..., xn} и A является матрицей nxn постоянных значений. Дело в том, что каждая строка B (X) формируется через программу в цикле FOR. Я хочу использовать fsolve для решения набора уравнений. – user2745742

+0

@ user2745742: это не оправдывает эту технику. Вы в основном решаете линейную комбинацию нелинейных уравнений. Есть лучшие способы сделать это (теперь нужно бежать, извините) –

+0

Я реализовал ваше решение 5) ниже :) –

1

Это сравнительно легко, если у вас есть доступ к Символическому Toolbox:

C=regexprep(cellfun(@func2str, B, 'uni', 0), '@\(x\)', ''); 
F=arrayfun(@(d) ['@(x) ', char(d)], sym(A)*sym(C), 'uni', 0); 

Это возвращает

>> F 
F = 
    '@(x) 3*x(1) - 4*x(2) + x(2)^2' 
    '@(x) 7*x(1) - 8*x(2) + 3*x(2)^2' 

Обратите внимание, что на самом деле Символическая манипуляция simplies результата.

+0

Mohsen это был очень умный трюк. Спасибо за ваш ответ еще раз. – user2745742