Я реализую NNLS algorithm для окончательного проекта для класса, и я пытаюсь найти элегантный способ построения нового вектора w 'из существующего вектора w и список индексов P. Мое неуклюжее решение показано ниже.Создайте вектор из списка индексов
function [w_prime] = vector_from_indices[w, P]
w_prime = zeros(numel(P));
for i = 1:numel(P)
w_prime(i) = w(P(i));
end
end
Есть ли способ сделать это элегантно в линии или более эффективно? Я CS главным принимать более высокого уровня, курс математики, поэтому я решил применить строгость программ эстетики моего окончательного проекта :)
НОВАЯ ПРОБЛЕМА:
function [a] = minimizer(P, d, s)
a = d(P(1))/(d(P(1)) - s(P(1)));
for i =1:numel(P)
if a > d(P(i))/(d(P(i)) - s(P(i)))
a = d(P(i))/(d(P(i)) - s(P(i)));
end
end
end
>> P
P =
1 3 4
>> d
d =
0.4387
0.3816
0.7655
0.7952
0.1869
>> s
s =
0.4898
0.4456
0.6463
0.7094
0.7547
>> a = minimizer(P,d,s)
a =
-8.5995
>> d(1)/(d(1) - s(1))
d(3)/(d(3) - s(3))
d(4)/(d(4) - s(4))
ans =
-8.5995
ans =
6.4219
ans =
9.2643
>> b = min(d(P)/(d(P) - s(P)))
b =
0 3.6806 0
>> d(P)/(d(P) - s(P))
ans =
0 3.6806 0
0 6.4219 0
0 6.6709 0
Я создал функцию что минимизирует значения d/(ds) для индексов в P. Существует ли способ найти эту минимизацию с использованием встроенных функций MATLAB? Очевидно, однострочное выражение (где я назначаю b) не работает, и я думаю, что понимаю, почему; он генерирует матрицу 3x3 со всеми перестановками индексов в P на d и s и просто нахождением минимальной строки (может быть, через норму, но, вероятно, просто принимая суммы строк). Есть ли выражение, которое будет вести себя как функция?
Как насчет 'w (P)'? – Divakar
Спасибо, это именно то, что мне нужно. –
Хорошо, обновите вопрос! Требуется новое применение элегантности. –