automatique de radiodiffusion appliqué " sur des matrices de même taille
Je suis en train d'écrire des devoirs à faire et je tombe sur cette erreur en utilisant l'Octave. Il n'affecte pas les fonctionnalités de ma solution, mais je suis curieux de savoir pourquoi cet avertissement est émis.
% X is column vector, p is max degree of polynom
% example:
% X = [1;2;3;4], p = 3
% X_poly = [1,1,1; 2,4,8; 3,9,27; 4,16,64]
function [X_poly] = polyFeatures(X, p)
powers = ones(numel(X),1) * linspace(1,p,p);
X_poly = X .^ powers;
end
Ce qui concerne,
Tom
Vous devez vous connecter pour publier un commentaire.
Commencer l'analyse de cette:
La gauche facteur est évidemment
numel(X)
par1
, et le droit facteur est1
parp
, et vous obtenez une matricenumel(X)
parp
.Alors voici le problème:
L'opérande de gauche est
numel(X)
par1
et l'opérande de droite estnumel(X)
parp
. Ce n'est pas le match.Je pense qu'il devrait tout simplement être une erreur, mais octave est apparemment en essayant de comprendre ce que tu voulais dire au lieu de ce que vous avez écrit, mais alors vous donnant un avertissement qu'il est dans le doute.
Avoir singleton extension réalisée, vous pouvez utiliser
bsxfun
ourepmat
.Depuis la cession de
powers
est juste une manière désordonnée à fairerepmat
, etbsxfun
permettra de développer à la fois des paramètres, vous pouvez à la place faire:qui le rend un peu inutile d'avoir une fonction spéciale à cet effet.
matlab
, et c'est illégal.Automatique de la radiodiffusion est un assez nouveau Octave caractéristique qui les jette dans une bsxfun partout où il y a une dimension l'inadéquation entre un singleton et non-singleton dimension.
Dans ce cas
X_poly = X .^ pouvoirs;
est remplacé par
X_poly = bsxfun(@power, X, pouvoirs);
C'est parfaitement légal octave comportement et plus elle semble être exactement ce que vous voulez faire, vous n'avez pas ont à le changer.
L'avertissement est parce que Matlab ne prend pas en charge automatique de la radiodiffusion de manière à ce qu'ils veulent de vous rappeler si vous avez essayé d'exécuter ce code dans Matlab, il serait un échec.
Par ailleurs, une pratique courante chez de nombreux Octave programmeurs est de s'appuyer principalement sur l'incompatibilité de taille comme un moyen de détecter les bugs dans leur programme. J'ai même pris un cours d'apprentissage automatique où le prof a dit à toute la classe, "Si toutes les dimensions de la ligne, alors il est probablement correct". C'est terrible, terrible, des conseils et un moyen sûr de s'assurer que tout le monde omet de faire les devoirs, mais il reflète une approche commune entre de nombreux chercheurs à l'écriture de Matlab/Octave programmes.
Pour cette raison, l'introduction automatique de radiodiffusion sans aucun avertissement pourrait provoquer des bug de traçage des difficultés pour vous si vous n'êtes pas dans l'habitude de faire des affirmations explicites au sujet de votre fonction des entrées.
Si vous voulez vous débarrasser de l'avertissement, vous pouvez simplement ajouter
à votre code.
Si vous voulez vous entretenir au mieux Matlab compatibilité ou tout simplement ne pas utiliser automatique de la radiodiffusion et aurait plutôt octave erreur pour aider à isoler les bugs, vous pouvez ajouter
à la place.