matlab - Error using ./ Matrix dimensions must agree - matlab

Why am i getting this error?
In this program I want to get a linear regression. Next, I want to remove outlier data. Then, outliers are colored red, and normal points colored blue, the fitting line is colored green.
In this program in end command occurs an error. Can someone help me understand why?
x=[-0.05623 -0.20968 0.192102 0.992332 0.576244 1.305784 ...
-0.72931 -0.86457 -0.09492 1.383214 1.303681 -0.12581 ...
-0.59687 -1.52065 0.671842 0.022844 -1.17779 -0.33458 ...
-1.82946 0.42999 -0.17399 1.631242 -1.35943 0.970507 ...
0.14364 0.082604 0.716664 1.193484 -1.07106 1.318902 ...
-1.21 -1.07411 -0.67256 0.736462 -1.06996 0.334715 ...
0.411883 0.15412 0.554571 -1.17285 1.007587 0.11352 ...
0.730051 -0.98351 0.052032 0.877599 1.014141 -0.08435 ...
-1.85353 -1.09682 0.218628 0.794246 0.463124 -0.61263 ...
2.2444 0.072348 0.865514 -0.4157 -1.11494 0.685252 ...
1.037673 1.822212 -0.52899 -1.62797 1.617302 0.264137 ...
-1.12715 -0.55918 -0.80885 1.161004 0.592105 0.242748 ...
0.240477 -0.8215 0.993112 0.346395 -0.26113 -0.18471 ...
-0.10173 -0.88704 0.741377 1.392208 2.4739 0.503919 ...
-0.82248 0.200982 -1.00705 -0.61317 -0.65896 -0.83323 ...
0.378179 -1.11534 0.667241 0.795333 1.037492 -0.02043 ...
0.618953 1.803064 0.052993 -0.17789];
y=[5.436978 3.947596 5.153861 7.203315 5.725703 6.793873 3.545316 3.936359 ...
4.237048 6.839705 7.122279 4.810857 4.288197 2.756219 6.208018 4.655615 ...
3.29746 4.037378 2.486194 5.55364 4.931752 7.288785 3.057518 6.765781 ...
4.633195 4.574674 5.536068 7.039812 3.51258 6.771749 3.625891 3.429356 ...
3.524448 5.804945 2.987637 5.782922 5.441024 4.886507 5.662118 2.994722 ...
6.762253 5.310672 6.183994 3.647019 5.090687 6.037325 6.680508 4.631969 ...
1.904436 3.03886 5.583692 6.479913 5.177385 4.037497 8.4407 4.928997 ...
6.522089 4.451288 3.282642 5.863934 6.755633 7.983111 4.344549 2.487526 ...
7.696832 5.129475 3.351763 4.571945 3.730939 6.493319 6.459757 5.291498 ...
5.490604 3.531393 6.574259 5.65695 4.609641 4.81884 5.201688 3.25646 ...
6.172526 6.502666 8.719206 6.323678 4.043084 5.299436 3.389938 4.235615 ...
4.322408 3.754491 6.042199 3.087029 5.413286 5.972943 6.497619 4.859718 ...
5.679203 8.097901 4.604103 4.588513];
n=1
p=polyfit(x,y,n);
a=p(1); b=p(2);
ymodel=a*x+b;
plot(x,y,'o',x,ymodel);
all_idx = 1:length(x);
outlier_idx = abs(x -median(x)) > 2*std(x) | abs(y - median(y)) > 2*std(y)
x(outlier_idx) = interp1(all_idx(~outlier_idx), ...
x(~outlier_idx), all_idx(outlier_idx));
y(outlier_idx) =interp1(all_idx(~outlier_idx), ...
y(~outlier_idx), all_idx(outlier_idx));
x_out_ind = find(outlier_idx); % gives the index of outliers
% the next line gives an error: matrix dimensions must agree:
x_normal_ind = find(ones(1,00)-x_out_ind); % gives the index of normal
for i=x_normal_ind
% this plot command gives an error:
plot(x(i),y(i),'o','blue')
hold on
end
for i=x_out_ind
% this plot command gives an error:
plot(x(i),y(i),'o','red')
hold on
end
plot(x,a*x+b,'green')

First error is because ones(1,00) will return an empty matrix which is not the same size as x_out_ind i.e. matrix dimensions do not agree.
Second error is because you have supplied two strings to the plot command. This is often treated as a 'property':'value' pairing. So it is saying that the property 'o' is not valid.
I'd suggest using 'dbstop if error' and track down the errors one at a time.

Related

Lsode throwing INTDY-- T (=R1) ILLEGAL and invalid input detected

I have my function:
function [result] = my_func(x,y)
result = y^2*(1-3*x)-3*y;
endfunction
Also, my vector with Ts, my function address and my initial variable x_0
load file_with_ts
# Add my limits as I also want to calculate those
# (all values in file_with_ts are within those limits.)
t_points = [-1, file_with_ts, 2]
myfunc = str2func("my_func")
x_0 = 0.9142
I am trying to execute the following line:
lsode_d1 = lsode(myfunc, x_0, t_points)
And expecting a result, but getting the following error:
INTDY-- T (=R1) ILLEGAL
In above message, R1 = 0.7987082301475D+00
T NOT IN INTERVAL TCUR - HU (= R1) TO TCUR (=R2)
In above, R1 = 0.8091168896311D+00 R2 = 0.8280400838323D+00
LSODE-- TROUBLE FROM INTDY. ITASK = I1, TOUT = R1
In above message, I1 = 1
In above message, R1 = 0.7987082301475D+00
error: lsode: invalid input detected (see printed message)
error: called from
main at line 20 column 10
Also, the variable sizes are:
x_0 -> 1x1
t_points -> 1x153
myfunc -> 1x1
I tried transposing the t_points vector
using #my_func instead of the str2func function
I tried adding multiple variables as the starting point (instead of x_0 I entered [x_0; x_1])
Tried changing my function header from my_func(x, y) to my_func(y, x)
Read the documentation and confirmed that my_func allows x to be a vector and returns a vector (whenever x is a vector).
EDIT: T points is the following 1x153 matrix (with -1 and 2 added to the beggining and the end respectively):
-4.9451e-01
-4.9139e-01
-4.7649e-01
-4.8026e-01
-4.6177e-01
-4.5412e-01
-4.4789e-01
-4.2746e-01
-4.1859e-01
-4.0983e-01
-4.0667e-01
-3.8436e-01
-3.7825e-01
-3.7150e-01
-3.5989e-01
-3.5131e-01
-3.4875e-01
-3.3143e-01
-3.2416e-01
-3.1490e-01
-3.0578e-01
-2.9267e-01
-2.9001e-01
-2.6518e-01
-2.5740e-01
-2.5010e-01
-2.4017e-01
-2.3399e-01
-2.1491e-01
-2.1067e-01
-2.0357e-01
-1.8324e-01
-1.8112e-01
-1.7295e-01
-1.6147e-01
-1.5424e-01
-1.4560e-01
-1.1737e-01
-1.1172e-01
-1.0846e-01
-1.0629e-01
-9.4327e-02
-8.0883e-02
-6.6043e-02
-6.6660e-02
-6.1649e-02
-4.7245e-02
-2.8332e-02
-1.8043e-02
-7.7416e-03
-6.5142e-04
1.0918e-02
1.7619e-02
3.4310e-02
3.3192e-02
5.2275e-02
5.5756e-02
6.8326e-02
8.2764e-02
9.5195e-02
9.4412e-02
1.1630e-01
1.2330e-01
1.2966e-01
1.3902e-01
1.4891e-01
1.5848e-01
1.7012e-01
1.8026e-01
1.9413e-01
2.0763e-01
2.1233e-01
2.1895e-01
2.3313e-01
2.4092e-01
2.4485e-01
2.6475e-01
2.7154e-01
2.8068e-01
2.9258e-01
3.0131e-01
3.0529e-01
3.1919e-01
3.2927e-01
3.3734e-01
3.5841e-01
3.5562e-01
3.6758e-01
3.7644e-01
3.8413e-01
3.9904e-01
4.0863e-01
4.2765e-01
4.2875e-01
4.3468e-01
4.5802e-01
4.6617e-01
4.6885e-01
4.7247e-01
4.8778e-01
4.9922e-01
5.1138e-01
5.1869e-01
5.3222e-01
5.4196e-01
5.4375e-01
5.5526e-01
5.6629e-01
5.7746e-01
5.8840e-01
6.0006e-01
5.9485e-01
6.1771e-01
6.3621e-01
6.3467e-01
6.5467e-01
6.6175e-01
6.6985e-01
6.8091e-01
6.8217e-01
6.9958e-01
7.1802e-01
7.2049e-01
7.3021e-01
7.3633e-01
7.4985e-01
7.6116e-01
7.7213e-01
7.7814e-01
7.8882e-01
8.1012e-01
7.9871e-01
8.3115e-01
8.3169e-01
8.4500e-01
8.4168e-01
8.5705e-01
8.6861e-01
8.8211e-01
8.8165e-01
9.0236e-01
9.0394e-01
9.2033e-01
9.3326e-01
9.4164e-01
9.5541e-01
9.6503e-01
9.6675e-01
9.8129e-01
9.8528e-01
9.9339e-01
Credits to Lutz Lehmann and PierU.
The problem lied in the array t_points not being a monotonous array. Adding a sort(t_points) before doing any calculations fixed the error.

Error on print_usage and fzero while Running Matlab Script in Octave

I am trying to run inputfile_calrel_example1 FERUM Matlab scripts from https://www.sigma-clermont.fr/en/ferum in Octave-5.1.0.0 but run into errors with respect to print_usage and fzero as follows:
error: Invalid call to fzero. Correct usage is:
-- fzero (FUN, X0)
-- fzero (FUN, X0, OPTIONS)
-- [X, FVAL, INFO, OUTPUT] = fzero (...)
error: called from
print_usage at line 91 column 5
fzero at line 133 column 5
drho0_dthetaf_integral at line 75 column 22
mod_corr_solve at line 99 column 54
form at line 90 column 58
ferum at line 129 column 33
>>
Looking through print_usage.m file reveals line 91 as follows:
error ("Octave:invalid-fun-call", msg);
while lines 78 to 92:
if (at_toplev)
error ("Octave:invalid-fun-call",
"Invalid call to %s. Correct usage is:\n\n%s\n%s",
name, usage_string, __additional_help_message__ ());
else
msg = sprintf ("Invalid call to %s. Correct usage is:\n\n%s",
name, usage_string);
## Ensure that the error doesn't end up with a newline, as that disables
## backtraces.
if (msg(end) == "\n")
msg(end) = " ";
endif
error ("Octave:invalid-fun-call", msg);
endif
and fzero lines 132 to 134 are as follows:
if (nargin < 2 | nargin > 3)
print_usage (mfilename ());
end
I would like to have hints as to how to resolve the above error messages.
Best regards
Aliyu Aziz
As stated in the comments, fzero was called with the following arguments.
drho0_dthetafi.mu = fzero( ...
'betadrho0_dthetaf' ...
, 0 ...
, optimset('fzero') ...
, dF_dthetafi.mu ...
, PHI2 ...
, F ...
, dPHI2_dZi ...
, dZi_dthetafi.mu ...
, dPHI2_drho0 ...
, detJ ...
, WIP ...
);
From the documentation (help fzero) you can see that the above call is not a valid fzero call:
-- fzero (FUN, X0, OPTIONS)
Find a zero of a univariate function
FUN is a function handle, inline function, or string containing the
name of the function to evaluate.
X0 should be a two-element vector specifying two points which
bracket a zero. If X0 is a single scalar then several nearby and distant
values are probed in an attempt to obtain a valid bracketing. If this is not
successful, the function fails.
OPTIONS is a structure specifying additional options.
To initialize an options structure with default values for 'fzero'
use 'options = optimset ("fzero")'.
So as you see, the extra arguments after 'optimset' trigger an error.
I'm assuming that the extra arguments were intended to be arguments to the betadrho0_dthetaf function. In general the function FUN expects a single argument (since it is univariate). If your betadrho0_dthetaf function expects a number of other parameters, then instead of using it in fzero via string, wrap it around an anonymous function handle which does only take a single argument, and uses your intended function internally to calculate the intended result, e.g.
drho0_dthetafi.mu = fzero( ...
#(x) betadrho0_dthetaf( ...
x ...
, dF_dthetafi.mu ...
, PHI2 ...
, F ...
, dPHI2_dZi ...
, dZi_dthetafi.mu ...
, dPHI2_drho0 ...
, detJ ...
, WIP ...
) ...
, 0 ...
, optimset('fzero') ...
);
or something along those lines, depending on how you would call that beta function.

Syntax error when running matlab code

I downloaded some matlab code, when trying to run a test file, it ends finding a syntax error, this one here:
parse error near line 151 of file /media/34GB/escola/efficientLBP/pixelwiseLBP.m
syntax error
>>>> [minLBP, ~]=sortNeighbours( binaryWord, weigthVec,...
^
The code it is:
else % if iChan==1 || isChanWiseRot
[minLBP, ~]=sortNeighbours( binaryWord, weigthVec,...
iCircShiftMinLBP(iRow, iCol) );
What is wrong here? Thanks for the time.
P.S: EDITED
Here is the extra code requested:
for iRow=( filtDimsR(1)+1 ):( padImgSize(1)-filtDimsR(1) )
for iCol=( filtDimsR(2)+1 ):( padImgSize(2)-filtDimsR(2) )
subImg=chanImgPad(iRow+( -filtDimsR(1):filtDimsR(1) ),...
iCol+( -filtDimsR(2):filtDimsR(2) ));
% find differences between current pixel, and it's neighours
diffVec=sum(sum( filtR.*repmat(subImg,[1, 1, nNeigh]) ));
diffVec=roundnS(diffVec, nEps);
binaryWord=( diffVec(:)>=0 );
if isRotInv
if iChan==1 || isChanWiseRot % go through all posible binary
% word combination, finding minimal LBP
[minLBP, iCircShiftMinLBP(iRow, iCol)]=...
sortNeighbours(binaryWord, weigthVec);
else % if iChan==1 || isChanWiseRot
[minLBP, ~]=sortNeighbours( binaryWord, weigthVec,...
iCircShiftMinLBP(iRow, iCol) );
end % if iChan==1 || isChanWiseRot
else
minLBP=weigthVec*binaryWord;
end % if isRotInv
currChanLBP(iRow, iCol)=cast( minLBP, outClass); % convert to decimal.
end % for iCol=(1+filtDimsR(2)):(imgSize(2)-filtDimsR(2))
% Present waitbar- a bar with progress, time passed and time remaining
waitbarTimeRemaining(hWaitbar, hTicPixelwiseLBP,...
(( iRow-filtDimsR(1) )+nRows*(iChan-1))/(nClrChans*nRows));
end % for iRow=(1+filtDimsR(1)):(imgSize(1)-filtDimsR(1))

MATLAB: errorn in butter() command

I wrote the following function:
function [output_signal] = AddDirectivityError (bat_loc_index, butter_deg_vector, sound_matrix)
global chirp_initial_freq ;
global chirp_end_freq;
global sampling_rate;
global num_of_mics;
global sound_signal_length;
for (i=1 : num_of_mics)
normalized_co_freq = (chirp_initial_freq + chirp_end_freq)/ (1.6* sampling_rate);
A=sound_matrix ( i, : ) ;
peak_signal=max(A);
B=find(abs(A)>peak_signal/100);
if (butter_deg_vector(i)==0)
butter_deg_vector(i)=2;
end
[num, den] = butter(butter_deg_vector(i), normalized_co_freq, 'low');// HERE!!!
filtered_signal=filter(num,den, A );
output_signal(i, :)=filtered_signal;
end
This functions runs many-many times without any error. However, when I reach the line: [num, den] = butter ( butter_deg_vector(i), normalized_co_freq, 'low');
And the local variables are: i=3, butter_deg_vector(i)=1, normalized_co_freq=5.625000e-001
MATLAB prompts an error says:
??? Error using ==> buttap Expected N to be integer-valued.
"Error in ==> buttap at 15 validateattributes(n,{'numeric'},{'scalar','integer','positive'},'buttap','N');
Error in ==> butter at 70 [z,p,k] = buttap(n);"
I don't understand why this problem occurs especially in this iteration. Why does this function prompt an error especially in this case?
Try to change the code line for:
[num, den] = butter (round(butter_deg_vector(i)), normalized_co_freq, 'low');

find corresponding peaks in matlab with 95% confidence interval

Suppose that we have following array:
0.196238259763928
0.0886250228175519
0.417543614272817
0.182403230538167
0.136500793051860
0.389922187581014
0.0344012946153299
0.381603315802419
0.0997542838649466
0.274807632628596
0.601652859233616
0.209431489000677
0.396925294300794
0.0351587496999554
0.177321874549738
0.369200511917405
0.287108838007101
0.477076452316346
0.127558716868438
0.792431584110476
0.0459982776925879
0.612598437936600
0.228340227044324
0.190267907472804
0.564751537228850
0.00269368929400299
0.940538666131177
0.101588565140294
0.426175626669060
0.600215481734847
0.127859067121782
0.985881201195063
0.0945679498528667
0.950077461673118
0.415212985598547
0.467423473845033
1.24336273213410
0.0848695928658021
1.84522775800633
0.289288949281834
1.38792131632743
1.73186592736729
0.554254947026916
3.46075557122590
0.0872957577705428
4.93259798197976
2.03544238985229
3.71059303259615
8.47095716918618
0.422940369071662
25.2287636895831
4.14535369056670
63.7312173032838
152.080907190007
1422.19492782494
832.134744027851
0.0220089962114756
60.8238733887811
7.71053463387430
10.4151913932115
11.3141744831953
0.988978595613829
8.65598040591953
0.219820300144944
3.92785491164888
2.28370963778411
1.60232807621444
2.51086405960291
0.0181622519984990
2.27469230188760
0.487809730727909
0.961063613990814
1.90435488292485
0.515640996120482
1.25933693517960
0.0953200831348589
1.52851575480462
0.582109930768162
0.933543409438383
0.717947488528521
0.0445235241119612
1.21157308704582
0.0942421028083462
0.536069075206508
0.821400666720535
0.308956823975938
1.28706199713640
0.0339217632187507
1.19575886464231
0.0853733920496230
0.736744959694641
0.635218502184121
0.262305581223588
0.986899895695809
0.0398800891449550
0.758792061180657
0.134279188964854
0.442531129290843
0.542782326712391
0.377221037448628
0.704787750202814
0.224180325609783
0.998785634315287
0.408055416702400
0.329684702125840
0.522384453408780
0.154542718256493
0.602294251721841
0.240357912028348
0.359040779285709
0.525224294805813
0.427539247203335
0.624034405807298
0.298184846094056
0.498659616687732
0.0962076792277457
0.430092706132805
0.656212420735658
0.278310520474744
0.866037361133916
0.184971060800812
0.481149730712771
0.624405636807668
0.382388147099945
0.435350646037440
0.216499523971397
1.22960953802959
0.330841706900755
0.891793067878849
0.628241046456751
0.278687691121678
1.06358076764171
0.365652714373067
1.34921178081181
0.652888708375276
0.861138633227739
1.02878577330537
0.591174450919664
1.93594290806582
0.497631035062465
1.14486512201656
0.978067581547298
0.948931658572253
2.01004088022982
0.917415940349743
2.24124811810385
1.42691656876436
2.15636037453584
1.92812357585099
1.12786835077183
4.81721425534142
1.70055431306602
4.87939454466131
3.90293284926105
5.16542230018432
10.5783535493504
1.74023535081791
27.0572221453758
7.78813114379733
69.2528169436690
167.769806437531
1490.03057130613
869.247150795648
3.27543244752518
62.3527480644562
9.74192115073051
13.6074209231800
10.5686495478844
7.70239986387120
9.62850426896699
9.85304975304259
7.09026325332085
12.8782040428502
16.3163128995995
7.00070066635845
74.1532966917877
4.80506505312457
1042.52337489620
1510.37374385290
118.514435606795
80.7915675273571
2.96352221859211
27.7825124315786
1.55102367292252
8.66382951478539
5.02910503820560
1.25219344189599
7.72195587189507
0.356973215117373
6.06702456628919
1.01953617014621
2.76489896186652
3.35353608882459
0.793376336025486
4.90341095941571
0.00742857354167949
5.07665716731356
1.16863474789604
4.47635486149688
4.33050121578669
2.42974020115261
9.79494608790444
0.0568839453395247
22.9153086380666
4.48791386399205
59.6962194708933
97.8636220152072
1119.97978883924
806.144299041605
7.33252581243942
57.0699524267842
0.900104994068117
15.2791339483160
3.31266162202546
3.20809490583211
5.36617545130941
0.648122925703121
3.90480316969632
0.0338850542128927
2.58828964019220
0.543604662856673
1.16385064506181
1.01835324272839
0.172915006573539
1.55998411282069
0.00221570175453666
1.14803074836796
0.0769335878967426
0.421762398811163
0.468260146832541
0.203765185125597
0.467641715366303
0.00142988680149041
0.698088976126660
0.0413316717103625
0.190548157914037
0.504713663418641
0.325697764871308
0.375910057283262
0.123307135682793
0.331115262928959
0.00263961045860704
0.204555648718379
0.139008751575803
0.182936666944843
0.154943314848474
0.0840483576044629
0.293075999812128
0.00306911699543199
0.272993318570981
0.0864711337990886
0.280495615619829
0.0910123210559269
0.148399626645134
0.141945002415500
0.0512001531781583
0.0295283557338525
In MATLAB it is very easy to find peaks using findpeaks, like so:
[pxx_peaks,location] = findpeaks(Pxx);
If we plot pxx_peaks, we get
plot(pxx_peaks)
Of course, besides these peaks, there are smaller peaks which are not shown on the picture, but my goal is to find all peaks which are 95-96% above all other peaks.
I have tried like this:
>> average = mean(pxx_peaks);
>> stand = std(pxx_peaks);
>> final_peaks = pxx_peaks( pxx_peaks > average + 3*stand );
The result of this is
>> final_peaks
final_peaks =
1.0e+03 *
1.4222
1.4900
1.5104
1.1200
but how to return their corresponding locations? I want to write it as one m-file, so please help me
EDIT
also please help me in this question: can I parameterize the confidence interval? For instance instead of 95%, I want to find peaks that are 60% above then other peaks, is it possible?
Note that 3σ ≈ 99.73%
As for your first question, it's easy, you just have to keep track of the locations in the same way as you do for the peaks:
inds = pxx_peaks > mean(pxx_peaks) + 3*std(pxx_peaks);
final_peaks = pxx_peaks(inds);
final_locations = location(inds);
plot(Pxx), hold on
plot(final_locations, final_peaks, 'r.')
As for your second question, that's a little more complicated. If you want to formulate it like you say, you'll have to convert a desired percentage to the correct number of σ. That involves an integration of the standard normal, and a root finding:
%// Convert confidence interval percentage to number-of-sigmas
F = #(P) fzero(#(sig) quadgk(#(x) exp(-x.^2/2),-sig,+sig)/sqrt(2*pi) - P/100, 1);
% // Repeat with the desired percentage
inds = pxx_peaks > mean(pxx_peaks) + F(63)*std(pxx_peaks); %// 63%
final_peaks = pxx_peaks(inds);
final_locations = location(inds);
plot(final_locations, final_peaks, 'r.')