0

У меня возникли проблемы с созданием функции, которая делает то, что я хочу. Я пытаюсь создать анонимную функцию, которая при принятии вектора длины N создает матрицу NxN. Я хотел бы заполнить каждый элемент матрицы (т. Е. С помощью цикла). Краткий пример более конкретно:создать матричную функцию векторной переменной ввода (Matlab)

N = 2; 
Qjk = @(x,y) x * y; 

for j = 1:N 
    for k = 1:N 

    Q(j,k) [email protected](x) Qjk(x(k),rand); 

    end 
end 

В конце концов это должно производить, например .:

Q = @(x) [.23*x(1), .16*x(2); .95*x(1), .62*x(2)] 

Я могу написать окончательное выражение выше вручную и он работает по мере необходимости, но я m не удалось автоматизировать этот процесс с помощью петли/векторизации. Благодарю.

+0

Кто-нибудь еще есть предложение? – ConfusinglyCuriousTheThird

ответ

1

Так что я понимаю, что вы хотите создать N x N матрицу элементов, где вход является вектором длины N? ... и, более конкретно, вы хотите принять каждый элемент входного вектора x и генерировать новый 1 x N вектор, где каждый элемент в x получает новый размер 1 x N вектор?

Вы можете избежать петли с помощью bsxfun:

Q = bsxfun(@times, x(:).', rand(numel(x))); 

Я не уверен, что форма x есть, будь то строка или вектор-столбец, но я не собираюсь делать какие-либо предположения. x(:).' гарантирует, что ваш вектор станет вектором строки. Однако, если вы хотите, чтобы ваш код работал как он, избавитесь от анонимного объявления функции в самом цикле. Кроме того, вы, вероятно, захотите позвонить Qjk, поскольку это функция, которую вы объявили, а не Q, так как это матрица, которую вы пытаетесь заполнить.

Просто сделать:

N = 2; 
Q = zeros(N); % New - Allocate to be more efficient 
Qjk = @(x,y) x * y; 

for j = 1:N 
    for k = 1:N 

    Q(j,k) = Qjk(x(k),rand); % Change 

    end 
end 
+0

Что у меня выше да, когда я удалил анонимные вызовы функций. Я просто заполнил матрицы напрямую. Можете ли вы не просто использовать 'bsxfun'? Он делает то, что вы хотите, и вы можете даже обернуть это анонимной функцией, если хотите. 'Q = @ (x) bsxfun (@times, x (:). ', Rand (numel (x)));'. – rayryeng

+0

Hi Ray, на самом деле эти решения не делают то, что я хочу - я хочу, чтобы результат был анонимной функцией 'x'. Кажется, что оба они требуют, чтобы я сначала определял 'x'. Есть предположения? – ConfusinglyCuriousTheThird

+0

Это: 'Q = @ (x) bsxfun (@times, x (:). ', Rand (numel (x)));' не требует, чтобы вы сначала определяли 'x'. Это просто тот же самый код, который я написал выше, но завернутый в анонимную функцию. Поэтому вы можете просто вставить вектор, и он выведет для вас матрицу «N x N». – rayryeng

Смежные вопросы