Effacer les filtres
Effacer les filtres

Find groups of duplicate values and preserving order?

4 vues (au cours des 30 derniers jours)
Trung Ngo
Trung Ngo le 28 Juin 2019
Commenté : Trung Ngo le 2 Juil 2019
Hi all,
I have a 100x1 double matrix
matrix=[100--100].*rand(100,1)-100;
C=unique(matrix);
I would love to create a length(C) x length(matrix) matrix which contains the positioning index from matrix to later conduct a function.
Thank you for your time,
  4 commentaires
Rik
Rik le 2 Juil 2019
Can you make a small example to explain what you want?
Trung Ngo
Trung Ngo le 2 Juil 2019
Hi Rik, here is my code
[B, I] = sort(check_value);
lat_sorted=lat(I,:);
lon_sorted=lon(I,:);
for i=1:length(B)
for j=1:length(B)-1
if B(i+j)==B(i)
if B(i)==11
L = load('110.mat');
elseif B(i)==12
L = load('120.mat');
elseif B(i)==13
L = load('130.mat');
elseif B(i)==14
L = load('140.mat');
elseif B(i)==15
L = load('150.mat');
elseif B(i)==16
L = load('160.mat');
elseif B(i)==17
L = load('170.mat');
elseif B(i)==18
L = load('180.mat');
elseif B(i)==19
L = load('190.mat');
elseif B(i)==191
L = load('191.mat');
elseif B(i)==192
L = load('192.mat');
elseif B(i)==193
L = load('193.mat');
elseif B(i)==21
L = load('210.mat');
elseif B(i)==22
L = load('220.mat');
elseif B(i)==23
L = load('230.mat');
elseif B(i)==24
L = load('240.mat');
elseif B(i)==25
L = load('250.mat');
elseif B(i)==26
L = load('260.mat');
elseif B(i)==27
L = load('270.mat');
elseif B(i)==28
L = load('280.mat');
elseif B(i)==29
L = load('290.mat');
elseif B(i)==291
L = load('291.mat');
elseif B(i)==292
L = load('292.mat');
elseif B(i)==293
L = load('293.mat');
elseif B(i)==31
L = load('310.mat');
elseif B(i)==32
L = load('320.mat');
elseif B(i)==33
L = load('330.mat');
elseif B(i)==34
L = load('340.mat');
elseif B(i)==35
L = load('350.mat');
elseif B(i)==36
L = load('360.mat');
elseif B(i)==37
L = load('370.mat');
elseif B(i)==38
L = load('380.mat');
elseif B(i)==39
L = load('390.mat');
elseif B(i)==391
L = load('391.mat');
elseif B(i)==392
L = load('392.mat');
elseif B(i)==393
L = load('393.mat');
end
for l=i:i+j
tf(l) = interp2(L.x,L.y,L.is_land,lon_sorted(l),lat_sorted(l),'cubic');
end
elseif B(i+j)~=B(i)
continue;
end
end
end
As you can see B(1)=B(2)=B(3)=23 and I do not want to load them 3 times, I just want to load them 1 time only and run tf(l) 3 times for l=i:i+j (in this case i=1 and j is from 1 to 2)

Connectez-vous pour commenter.

Réponse acceptée

Rik
Rik le 2 Juil 2019
Modifié(e) : Rik le 2 Juil 2019
The code below is far from optimal, but it should help you out. It assumes there is always an L to load, and you have enough memory to store all the different mat files in a library. These assumptions are to memoization. You could improve the readability of this code by creating a masterlist of indices and file names, instead of endless elseifs. Then it is very easy to add or remove a new mat and it makes your code more readable. You can also check if the output of ismember sums to 1 to check for valid inputs.
function L=load_mat(Bi)
persistent L_libary
if isempty(L_libary),L_libary={};end
if numel(L_libary)>=Bi && ~isempty(L_libary{Bi})
L=L_libary{Bi};
end
if Bi==11
L = load('110.mat');
elseif Bi==12
L = load('120.mat');
elseif Bi==13
L = load('130.mat');
elseif Bi==14
L = load('140.mat');
elseif Bi==15
L = load('150.mat');
elseif Bi==16
L = load('160.mat');
elseif Bi==17
L = load('170.mat');
elseif Bi==18
L = load('180.mat');
elseif Bi==19
L = load('190.mat');
elseif Bi==191
L = load('191.mat');
elseif Bi==192
L = load('192.mat');
elseif Bi==193
L = load('193.mat');
elseif Bi==21
L = load('210.mat');
elseif Bi==22
L = load('220.mat');
elseif Bi==23
L = load('230.mat');
elseif Bi==24
L = load('240.mat');
elseif Bi==25
L = load('250.mat');
elseif Bi==26
L = load('260.mat');
elseif Bi==27
L = load('270.mat');
elseif Bi==28
L = load('280.mat');
elseif Bi==29
L = load('290.mat');
elseif Bi==291
L = load('291.mat');
elseif Bi==292
L = load('292.mat');
elseif Bi==293
L = load('293.mat');
elseif Bi==31
L = load('310.mat');
elseif Bi==32
L = load('320.mat');
elseif Bi==33
L = load('330.mat');
elseif Bi==34
L = load('340.mat');
elseif Bi==35
L = load('350.mat');
elseif Bi==36
L = load('360.mat');
elseif Bi==37
L = load('370.mat');
elseif Bi==38
L = load('380.mat');
elseif Bi==39
L = load('390.mat');
elseif Bi==391
L = load('391.mat');
elseif Bi==392
L = load('392.mat');
elseif Bi==393
L = load('393.mat');
end
L_libary{Bi}=L;
end
  6 commentaires
Rik
Rik le 2 Juil 2019
Well spotted. I've edited my answer accordingly. (I've shortened your comment to include only the change for readability of this thread)
Trung Ngo
Trung Ngo le 2 Juil 2019
Thanks Rik for your help, wish you the best

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Function Creation dans Help Center et File Exchange

Produits


Version

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by