2012-09-19 2 views
2

У меня есть матрица 3x3, A. Я также вычисляю значение g как максимальное собственное значение A. Я пытаюсь изменить элемент A (3,3) = 0 для всех значений от нуля до единицы с шагом 0.10, а затем обновить g для каждого из значений. Я бы хотел, чтобы все остальные матричные элементы остались прежними.Обновить только один матричный элемент для итеративного вычисления

Я думал, что для цикла будет способ сделать это, но я не знаю, как обновлять только один элемент в матрице, не сохраняя это обновление как одну более крупную матрицу. Если я назову элемент в точке A (3,3) = p (тем самым создав новую матрицу Atry), я могу (ниже) получить все значения от 0 до 1, которые я желал. Я не знаю, как обновить Atry, чтобы получить все значения g, которые я желаю. Состояние кода теперь даст мне то же значение g для всех итераций, как и ожидалось, поскольку я не знаю, как обновить Atry с разными значениями p, чтобы затем вычислить значения для g ,

Любые предложения относительно того, как это сделать или предложения по жаргону или фразам для меня в веб-поиске, будут оценены.

A = [1 1 1; 2 2 2; 3 3 0]; 
g = max(eig(A)); 

% This below is what I attempted to achieve my solution 
clear all 
p(1) = 0; 
Atry = [1 1 1; 2 2 2; 3 3 p]; 
g(1) = max(eig(Atry)); 

for i=1:100; 
    p(i+1) = p(i)+ 0.01; 
    % this makes a one giant matrix, not many 
    %Atry(:,i+1) = Atry(:,i); 
    g(i+1) = max(eig(Atry)); 
end 

ответ

2

Это будет также сделать то, что вы хотите сделать:

A = @(x) [1 1 1; 2 2 2; 3 3 x]; 
p = 0:0.01:1; 
g = arrayfun(@(x) eigs(A(x),1), p); 

Разбивка:

  • Определение A как анонимные функции. Это означает, что команда вернет вашу матрицу A с элементом (3,3), равным x.
  • Определить все шаги, которые вы хотите взять в векторе p
  • Затем «петлю» через все элементы в p с помощью arrayfun вместо фактического цикла.

Функция петельные сверх arrayfun не max(eig(A)) но eigs(A,1), т.е. 1 наибольшее собственное значение. Результат будет таким же, но алгоритм, используемый eigs, больше подходит для вашего типа проблем - вместо того, чтобы вычислять все собственных значений, а затем использовать только один, вы только вычислите максимальный. Излишне говорить, что это намного быстрее.

+0

Роди, спасибо, это было очень экономное решение моего вопроса. Я довольно новичок в MATLAB и программировании. Мне нужно будет больше узнать об анонимных функциях и массиве, однако я не знаю, как бы я их открыл самостоятельно. Спасибо за помощь. Я уверен, что в будущем буду задавать больше вопросов MATLAB. – nofunsally

1

Во-первых, вы говорите 0,1 приращения в тексте Вашего вопроса, но ваш код предполагает, что Вы на самом деле заинтересованы в с шагом 0,01? Я буду работать в предположении, что вы имеете в виду 0,01 приращения.

Теперь, с учетом этого, позвольте мне изложить то, что, как я считаю, после того, как я дал свое толкование вашего вопроса. Вы хотите итерации по матрице A, где для каждой итерации вы увеличиваете A (3, 3) на 0,01. Учитывая, что вы хотите, чтобы все значения от 0 до 1, это подразумевает 101 итерацию. Для каждой итерации вы хотите вычислить максимальное собственное значение A и сохранить все эти собственные значения в некотором векторе (который я назову gVec). Если это верно, то я полагаю, вы просто хотите следующее:

% Specify the "Current" A 
CurA = [1 1 1; 2 2 2; 3 3 0]; 
% Pre-allocate the values we want to iterate over for element (3, 3) 
A33Vec = (0:0.01:1)'; 
% Pre-allocate a vector to store the maximum eigenvalues 
gVec = NaN * ones(length(A33Vec), 1); 
% Loop over A33Vec 
for i = 1:1:length(A33Vec) 
    % Obtain the version of A that we want for the current i 
    CurA(3, 3) = A33Vec(i); 
    % Obtain the maximum eigen value of the current A, and store in gVec 
    gVec(i, 1) = max(eig(CurA)); 
end 

EDIT: Вероятно, лучше всего, чтобы вставить этот код в редакторе Matlab. Автоматическое выделение текста с переполнением стека не помогло :-)

EDIT: Идите с решением Роди (+1) - это намного лучше!

+1

Пользователь Amro создал пользовательский скрипт, который будет фиксировать выделение Matlab на SE в вашем браузере, см. [Matlab tag wiki] (http://stackoverflow.com/tags/matlab/info). В firefox установите с помощью Greasemonkey. У Chrome есть встроенная поддержка. –

+0

Nice. Работала отлично. Спасибо за головы! –

+0

Colin T Bowers - Это определенно тот маршрут, который я представлял, если бы смог полностью представить сценарий конца. В то время как код Роди более скупый, я полагаю, что буду использовать помощь, которую вы предоставили, чтобы попытаться использовать новые решения в будущем, поскольку это более похоже на мой текущий набор навыков. Спасибо. – nofunsally

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