Incompatible sizes of arrays.
9 views (last 30 days)
Show older comments
Hi everyone!
I have a problem with matrix multiplication. I have code where i use function fastica which count arrays [Out1, Out2, Out3] and i have to call array "Out3" from funciton fastica and multiply with the transposed matrix R (The R matrix is calculated in the main program), but i got error "Arrays have incompatible sizes for this operation."
Can someone explain why?
Thanku you in advance!
I attach main program and function below
%%%%%Main program%%%%
clc
clear
image_folder='/Users/admin/Desktop/Programy_ICA/OBRAZY';
filenames = dir(fullfile(image_folder, '*.jpg'));
total_images = numel(filenames);
X=[];
for i= 1:total_images
xi= [];
f_x=fullfile(image_folder, filenames(i).name);
image_x = imread(f_x);
xi = sum(double(image_x));
X = [xi; X];
m_x=X';
end
icolX = total_images;
m = mean(m_x,2);
for i = 1:icolX
R(:,i) = (m_x(:,i) -m);
end
[Out1,Out2,Out3] = fastica(m_x);
W=[];
W=Out3;
U=W.*R';
function which i'm calling in main program:
function [Out1, Out2, Out3] = fastica(mixedsig, varargin)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Check some basic requirements of the data
if nargin == 0,
error ('You must supply the mixed data as input argument.');
end
if length (size (mixedsig)) > 2,
error ('Input data can not have more than two dimensions.');
end
if any (any (isnan (mixedsig))),
error ('Input data contains NaN''s.');
end
if ~isa (mixedsig, 'double')
fprintf ('Warning: converting input data into regular (double) precision.\n');
mixedsig = double (mixedsig);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Remove the mean and check the data
[mixedsig, mixedmean] = remmean(mixedsig);
[Dim, NumOfSampl] = size(mixedsig);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Default values for optional parameters
% All
verbose = 'on';
% Default values for 'pcamat' parameters
firstEig = 1;
lastEig = Dim;
interactivePCA = 'off';
% Default values for 'fpica' parameters
approach = 'defl';
numOfIC = Dim;
g = 'pow3';
finetune = 'off';
a1 = 1;
a2 = 1;
myy = 1;
stabilization = 'off';
epsilon = 0.0001;
maxNumIterations = 500; %%było 1000
maxFinetune = 5;
initState = 'rand';
guess = 0;
sampleSize = 1;
displayMode = 'off';
displayInterval = 1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parameters for fastICA - i.e. this file
b_verbose = 1;
jumpPCA = 0;
jumpWhitening = 0;
only = 3;
userNumOfIC = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Read the optional parameters
if (rem(length(varargin),2)==1)
error('Optional parameters should always go by pairs');
else
for i=1:2:(length(varargin)-1)
if ~ischar (varargin{i}),
error (['Unknown type of optional parameter name (parameter' ...
' names must be strings).']);
end
% change the value of parameter
switch lower (varargin{i})
case 'stabilization'
stabilization = lower (varargin{i+1});
case 'maxfinetune'
maxFinetune = varargin{i+1};
case 'samplesize'
sampleSize = varargin{i+1};
case 'verbose'
verbose = lower (varargin{i+1});
% silence this program also
if strcmp (verbose, 'off'), b_verbose = 0; end
case 'firsteig'
firstEig = varargin{i+1};
case 'lasteig'
lastEig = varargin{i+1};
case 'interactivepca'
interactivePCA = lower (varargin{i+1});
case 'approach'
approach = lower (varargin{i+1});
case 'numofic'
numOfIC = varargin{i+1};
% User has supplied new value for numOfIC.
% We'll use this information later on...
userNumOfIC = 1;
case 'g'
g = lower (varargin{i+1});
case 'finetune'
finetune = lower (varargin{i+1});
case 'a1'
a1 = varargin{i+1};
case 'a2'
a2 = varargin{i+1};
case {'mu', 'myy'}
myy = varargin{i+1};
case 'epsilon'
epsilon = varargin{i+1};
case 'maxnumiterations'
maxNumIterations = varargin{i+1};
case 'initguess'
% no use setting 'guess' if the 'initState' is not set
initState = 'guess';
guess = varargin{i+1};
case 'displaymode'
displayMode = lower (varargin{i+1});
case 'displayinterval'
displayInterval = varargin{i+1};
case 'pcae'
% calculate if there are enought parameters to skip PCA
jumpPCA = jumpPCA + 1;
E = varargin{i+1};
case 'pcad'
% calculate if there are enought parameters to skip PCA
jumpPCA = jumpPCA + 1;
D = varargin{i+1};
case 'whitesig'
% calculate if there are enought parameters to skip PCA and whitening
jumpWhitening = jumpWhitening + 1;
whitesig = varargin{i+1};
case 'whitemat'
% calculate if there are enought parameters to skip PCA and whitening
jumpWhitening = jumpWhitening + 1;
whiteningMatrix = varargin{i+1};
case 'dewhitemat'
% calculate if there are enought parameters to skip PCA and whitening
jumpWhitening = jumpWhitening + 1;
dewhiteningMatrix = varargin{i+1};
case 'only'
% if the user only wants to calculate PCA or...
switch lower (varargin{i+1})
case 'pca'
only = 1;
case 'white'
only = 2;
case 'all'
only = 3;
end
otherwise
% Hmmm, something wrong with the parameter string
error(['Unrecognized parameter: ''' varargin{i} '''']);
end;
end;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% print information about data
if b_verbose
fprintf('Number of signals: %d\n', Dim);
fprintf('Number of samples: %d\n', NumOfSampl);
end
% Check if the data has been entered the wrong way,
% but warn only... it may be on purpose
if Dim > NumOfSampl
if b_verbose
fprintf('Warning: ');
fprintf('The signal matrix may be oriented in the wrong way.\n');
fprintf('In that case transpose the matrix.\n\n');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculating PCA
% We need the results of PCA for whitening, but if we don't
% need to do whitening... then we dont need PCA...
if jumpWhitening == 3
if b_verbose,
fprintf ('Whitened signal and corresponding matrises supplied.\n');
fprintf ('PCA calculations not needed.\n');
end;
else
% OK, so first we need to calculate PCA
% Check to see if we already have the PCA data
if jumpPCA == 2,
if b_verbose,
fprintf ('Values for PCA calculations supplied.\n');
fprintf ('PCA calculations not needed.\n');
end;
else
% display notice if the user entered one, but not both, of E and D.
if (jumpPCA > 0) & (b_verbose),
fprintf ('You must suply all of these in order to jump PCA:\n');
fprintf ('''pcaE'', ''pcaD''.\n');
end;
% Calculate PCA
[E, D]=pcamat(mixedsig, firstEig, lastEig, interactivePCA, verbose);
end
end
% skip the rest if user only wanted PCA
if only > 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Whitening the data
% Check to see if the whitening is needed...
if jumpWhitening == 3,
if b_verbose,
fprintf ('Whitening not needed.\n');
end;
else
% Whitening is needed
% display notice if the user entered some of the whitening info, but not all.
if (jumpWhitening > 0) & (b_verbose),
fprintf ('You must suply all of these in order to jump whitening:\n');
fprintf ('''whiteSig'', ''whiteMat'', ''dewhiteMat''.\n');
end;
% Calculate the whitening
[whitesig, whiteningMatrix, dewhiteningMatrix] = whitenv ...
(mixedsig, E, D, verbose);
end
end % if only > 1
% skip the rest if user only wanted PCA and whitening
if only > 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculating the ICA
% Check some parameters
% The dimension of the data may have been reduced during PCA calculations.
% The original dimension is calculated from the data by default, and the
% number of IC is by default set to equal that dimension.
Dim = size(whitesig, 1);
% The number of IC's must be less or equal to the dimension of data
if numOfIC > Dim
numOfIC = Dim;
% Show warning only if verbose = 'on' and user supplied a value for 'numOfIC'
if (b_verbose & userNumOfIC)
fprintf('Warning: estimating only %d independent components\n', numOfIC);
fprintf('(Can''t estimate more independent components than dimension of data)\n');
end
end
% Calculate the ICA with fixed point algorithm.
[A, W] = fpica (whitesig, whiteningMatrix, dewhiteningMatrix, approach, ...
numOfIC, g, finetune, a1, a2, myy, stabilization, epsilon, ...
maxNumIterations, maxFinetune, initState, guess, sampleSize, ...
displayMode, displayInterval, verbose);
% Check for valid return
if ~isempty(W)
% Add the mean back in.
if b_verbose
fprintf('Adding the mean back to the data.\n');
end
%icasig = W * mixedsig + (W * mixedmean) * ones(1, NumOfSampl);
icasig = W * mixedsig;
if b_verbose & ...
(max(abs(W * mixedmean)) > 1e-9) & ...
(strcmp(displayMode,'signals') | strcmp(displayMode,'on'))
fprintf('Note that the plots don''t have the mean added.\n');
end
else
icasig = [];
end
end % if only > 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The output depends on the number of output parameters
% and the 'only' parameter.
if only == 1 % only PCA
Out1 = E;
Out2 = D;
elseif only == 2 % only PCA & whitening
if nargout == 2
Out1 = whiteningMatrix;
Out2 = dewhiteningMatrix;
else
Out1 = whitesig;
Out2 = whiteningMatrix;
Out3 = dewhiteningMatrix;
end
else % ICA
if nargout == 2
Out1 = A;
Out2 = W;
else
Out1 = icasig;
Out2 = A;
Out3 = W;
end
end
end
0 Comments
Answers (1)
Matt J
on 24 Nov 2022
Edited: Matt J
on 24 Nov 2022
but i got error "Arrays have incompatible sizes for this operation." Can someone explain why?
It should be obvious from the dimensions of W (160x160) and R' (1115x160) shown in your screen shots. They aren't the same size.
Perhaps you meant to do matrix multiplication instead of element-wise multiplication: U=R'*W'
0 Comments
See Also
Categories
Find more on Dimensionality Reduction and Feature Extraction in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!