2015-04-30 6 views
0

Я реализую 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 и просто нахождением минимальной строки (может быть, через норму, но, вероятно, просто принимая суммы строк). Есть ли выражение, которое будет вести себя как функция?

+1

Как насчет 'w (P)'? – Divakar

+0

Спасибо, это именно то, что мне нужно. –

+0

Хорошо, обновите вопрос! Требуется новое применение элегантности. –

ответ

0

как указывает Дивакар, решение w (P). Благодаря!

0

Для редактирования 2 существует элементный оператор деления и векторный оператор деления. b = d (P) ./ (d (P) - s (P)) (с точкой) было то, что мне было нужно.

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