2012-11-27 4 views
1

Désolé pour les débutants question Matlab ...Matlab retour vecteur

function [ A B C ] = crunch(i) 
    A = i^2; 
    B = 2*A; 
    C = A+B; 
end; 

vals = zeros(5,3); 
    for i=1:5 
    vals(i,:) = crunch(i); 
    endfor; 
disp(vals); 

Ce n'est pas le résultat que je m'y attendais.

vals = 
1 1 1 
4 4 4 
9 9 9 
..... etc 

si je place explicitiy lieu A, B & C dans un vecteur de ligne et de retour qui, alors tout va bien.

function retval = crunch(i) 
    A = i^2; 
    B = 2*A; 
    C = A+B; 
    retval = [ A B C ]; 
end; 

ans = 
    1 2 3 
    4 8 12 
    9 18 27 
16 32 48 
25 50 75 

Qu'est-ce qui ne va pas ici?

+0

pour i = 1: 5 [vals (i, 1), vals (i, 2), vals (i, 3)] = crunch (i); fin disp (vals); – igon

+0

Merci, beaucoup à apprendre – Alasdair

Répondre

4

MATLAB est généralement réticent à vous donner plusieurs valeurs de retour à moins que vous ne les demandiez explicitement. Ainsi, dans la première version, lorsque vous faites:

vals(i,:) = crunch(i); 

Qu'est-ce que Matlab fait est juste prendre la première valeur de retour de crunch(i), puis diffusé que tous les éléments de vals(i,:). Il est comme faire:

return_val = crunch(i); 
vals(i,:) = return_val; 

Si vous demandez explicitement Matlab pour plusieurs valeurs de retour, vous obtenez le comportement souhaité. Comme @igon notes, cette version corrigera le comportement: dans ce cas

[vals(i,1), vals(i,2), vals(i,3)] = crunch(i); 

Ou, je pense que si vals étaient un réseau de cellules, vals{i, :} = crunch(i); fonctionnerait aussi, mais cela n'a pas de sens - en utilisant une base régulière (pas de cellule) array semble être la bonne approche dans votre code. L'utilisation de la première version de crunch produirait également la valeur correcte: vals = zeros (5,3);

Questions connexes