not enough input arguments

2 views (last 30 days)
Kamil Kacer
Kamil Kacer on 18 Nov 2020
Commented: Kamil Kacer on 21 Nov 2020
Iam trying to run function but it give me an error in ' d{i} = pdist2(F{i}.', testSample, 'mahalanobis');' not enough input arguments
function [Ps, winnerClass] = classifyKNN_D_Multi(F, testSample, k, NORMALIZE, useL1distance )
% function [Ps, winnerClass] = classifyKNN_D_Multi(F, testSample, k, NORMALIZE, useL1distance);
%
% This function is used for classifying an unknown sample using the kNN
% algorithm, in its multi-class form.
%
% ARGUMENTS:
% - F: an CELL array that contains the feature values for each class. I.e.,
% F{1} is a matrix of size numOfDimensions x numofSamples FOR THE FIRST
% CLASS, etc.
%
% - testSample: the input sample to be classified
% - k: the kNN parameter
% - NORMALIZE: use class priors to weight results
% - useL1distance: use L1 instead of L2 distance
%
% RETURNS:
% - Ps: an array that contains the classification probabilities for each class
% - winnerClass: the label of the winner class
%%error(nargchk(4,5,nargin))
switch nargin
case 4
useL1distance = '1'; % euclidean distance if 4 variables included
case 5
useL1distance = '0'; % mahalanobis distance if 5 variables included
otherwise
disp('error')
end
numOfClasses = length(F);
if (size(testSample, 2)==1)
testSample = testSample';
end
% initilization of distance vectors:
numOfDims = zeros( 1, numOfClasses );
numOfTrainSamples = zeros( 1, numOfClasses );
d = cell(numOfClasses,1);
% d{i} is a vector, whose elements represent the distance of the testing
% sample from all the samples of i-th class
testSample(isnan(testSample)) = 0.0;
for i=1:numOfClasses
[ numOfDims(i), numOfTrainSamples(i) ] = size( F{i} );
d{i} = inf*ones(max(numOfTrainSamples), 1); % we fill it with inf values
F{i}(isnan(F{i})) = 0.0;
end
if (length(testSample)>1)
for i=1:numOfClasses % for each class:
if (numOfTrainSamples(i)>0)
if ( useL1distance == 1 )
% d{i} = sum( abs(repmat(testSample, [numOfTrainSamples(i) 1]) - F{i}'),2); % L1
d{i} = pdist2(F{i}.', testSample, 'euclidean');
else
%[size(repmat(testSample, [numOfTrainSamples(i) 1])) size(F{i}')]
%sum(sum(isnan(F{i}')))
% d{i} = sum( ((repmat(testSample, [numOfTrainSamples(i) 1]) - F{i}').^2 ),2); % L2
d{i} = pdist2(F{i}.', testSample, 'mahalanobis'); %56
end
d{i} = sort(d{i});
d{i}(end+1:max(numOfTrainSamples)) = inf;
else
d{i} = inf;
end
end
else % single dimension (NO SUM required!!!)
for i=1:numOfClasses
if (numOfTrainSamples(i)>0)
d{i} = (abs(repmat(testSample, [numOfTrainSamples(i) 1]) - F{i}')');
d{i} = sort(d{i});
d{i}(end+1:max(numOfTrainSamples)) = inf;
else
d{i} = inf;
end
end
end
kAll = zeros(numOfClasses, 1);
for j=1:k
curArray = zeros(numOfClasses, 1);
for i=1:numOfClasses
curArray(i) = d{i}(kAll(i)+1);
end
[MIN, IMIN] = min(curArray);
kAll(IMIN) = kAll(IMIN) + 1;
end
if ( NORMALIZE == 0 )
Ps = (kAll ./ k);
else
Ps = kAll ./ numOfTrainSamples';
Ps = Ps / sum(Ps);
end
[MAX, IMAX] = max(Ps);
winnerClass = IMAX;
>> classifyKNN_D_Multi
error
Not enough input arguments.
Error in classifyKNN_D_Multi (line 30)
numOfClasses = length(F);
this is the function Iam classifying with variable Feature is 2 class and has same column size Can anyone tell me where the problem is ?
function [label, P, classNames] = ...
fileClassification(wavFileName, kNN, modelFileName)
%
% function [label, P, classNames] = ...
% fileClassification(wavFileName, kNN, modelFileName)
%
% This function demonstrates the classification of an audio segment,
% stored in a wav file.
%
% ARGUMENTS:
% - wavFileName: the path of the wav file to be classified
% - kNN: the k parameter of the kNN algorithm
% - modelFileName: the path of the kNN classification model
%
% RETURNS:
% - label: the label of the winner class
% - P: a vector that contains all estimated probabilities
% for each audio class contained in the model
% - classNames: a cell array that contains the names of the
% audio classes of the classification model
%
% NOTE: This function classifies the WHOLE audio file, i.e., we
% assume that the file contains a homogeneous audio segment.
% For mid-term classification, please use mtFileClassification().
%
% load classification model:
[Features, classNames, MEAN, STD, Statistics, ...
stWin, stStep, mtWin, mtStep] = kNN_model_load(modelFileName);
[x, fs] = audioread(wavFileName); % read wav file
% short-term feature extraction:
stF = stFeatureExtraction(x, fs, stWin, stStep);
mtWinRatio = mtWin / stWin; mtStepRatio = mtStep / stStep;
% mid-term feature statistic calculation:
[mtFeatures] = mtFeatureExtraction(...
stF, mtWinRatio, mtStepRatio, Statistics);
% long term averaging of the mid-term statistics:
mtFeatures = mean(mtFeatures,2);
% kNN classification
[P, label] = classifyKNN_D_Multi(Features, ...
(mtFeatures - MEAN') ./ STD', kNN,1);

Answers (2)

Walter Roberson
Walter Roberson on 19 Nov 2020
>> classifyKNN_D_Multi
You are trying to run a function that requires either 4 or 5 inputs, with no inputs at all.
case 4
useL1distance = '1'; % euclidean distance if 4 variables included
case 5
useL1distance = '0'; % mahalanobis distance if 5 variables included
The code sets useL1distance to a character regardless of what was passed in as the fifth parameter. Just the fact that you have five parameters is enough to assign the character '0' to useL1distance
if ( useL1distance == 1 )
It is never going to equal the number 1 because it was assigned the character '0' or the charater '1'
  4 Comments
Kamil Kacer
Kamil Kacer on 20 Nov 2020
Can i make it work li this ?
switch nargin
case 4
distancetype = 1; % euclidean distance if 4 variables included
case 5
distancetype = 2;
% if ~isscalar(distancetype) || ~isnumeric(distancetype) || ~ismember(distancetype, 1:3)
% error('invalid distance type');
end
and with this ?
if ( distancetype == 1 )
% d{i} = sum( abs(repmat(testSample, [numOfTrainSamples(i) 1]) - F{i}'),2); % L1
d{i} = pdist2(F{i}.', testSample, 'euclidean');
elseif ( distancetype == 2)
d{i} = pdist2(F{i}.', testSample, 'mahalanobis');
end
I dont get what 'cityblock' is
Walter Roberson
Walter Roberson on 20 Nov 2020
'cityblock' is another name for L1 norm.
Can i make it work li this ?
Why? If you are going to use a numeric parameter, then make it mean something.
When you go to write a GUI to allow the user to choose which distance type they want, are you going to want to code
if handles.distance_type_button.Value == 0
[P, label] = classifyKNN_D_Multi(Features, ...
(mtFeatures - MEAN') ./ STD', kNN, 1);
else
[P, label] = classifyKNN_D_Multi(Features, ...
(mtFeatures - MEAN') ./ STD', kNN, 1, 1);
end
or are you going to want to have a single call to the function with a parameter that indicates which distance type the user wanted?

Sign in to comment.


Kamil Kacer
Kamil Kacer on 20 Nov 2020
cityblock is another form of distance?
But I do not need it.
if ~isscalar(distancetype) || ~isnumeric(distancetype) || ~ismember(distancetype, 1:3);
error('invalid distance type');
why is this orring everything can u please explain this ?
  10 Comments
Walter Roberson
Walter Roberson on 21 Nov 2020
You told me before that you were passing in only 4 arguments but were still having mahalonobis being invoked, so that is the problem that I am trying to debug. This code shows you passing in 5 arguments. You specifically asked that passing in 5 arguments should always mean mahalonobis. I argued against that but you insisted so I changed it back for you.
Kamil Kacer
Kamil Kacer on 21 Nov 2020
But even with 4 arguments it gives an error
>> fileClassification('audio.wav', 5, 'auto4.mat')
Index exceeds the number of array elements (1).
Error in classifyKNN_D_Multi (line 77)
curArray(i) = d{i}(kAll(i)+1);
Error in fileClassification (line 43)
[P, label] = classifyKNN_D_Multi(Features, ...

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!