Matlab 矩阵1,2,3如何生成?
我想控制此矩阵中随机数的创建:Matlab 矩阵1,2,3如何生成?,matlab,random,matrix,Matlab,Random,Matrix,我想控制此矩阵中随机数的创建: Mp = floor(1+(10*rand(2,20))); mp1 = sort(Mp,2); 我想修改此代码以获得如下输出: 1 1 2 2 3 3 3 4 5 5 6 7 7 8 9 9 10 10 10 10 1 2 3 3 3 3 3 3 4 5 6 6 6 6 7 8 9 9 9 10 1 2 1 2 1 2 3 1 1 2 1 1 2 1 1 2 1 2 3 4 1 1 1 2 3 4 5 6 1 1 1 2 3 4 1 1 1 2 3
Mp = floor(1+(10*rand(2,20)));
mp1 = sort(Mp,2);
我想修改此代码以获得如下输出:
1 1 2 2 3 3 3 4 5 5 6 7 7 8 9 9 10 10 10 10
1 2 3 3 3 3 3 3 4 5 6 6 6 6 7 8 9 9 9 10
1 2 1 2 1 2 3 1 1 2 1 1 2 1 1 2 1 2 3 4
1 1 1 2 3 4 5 6 1 1 1 2 3 4 1 1 1 2 3 1
我必须以递增的顺序用从1到10的所有数字填充每一行,并且计算每个数字出现次数的第二个矩阵应如下所示:
1 1 2 2 3 3 3 4 5 5 6 7 7 8 9 9 10 10 10 10
1 2 3 3 3 3 3 3 4 5 6 6 6 6 7 8 9 9 9 10
1 2 1 2 1 2 3 1 1 2 1 1 2 1 1 2 1 2 3 4
1 1 1 2 3 4 5 6 1 1 1 2 3 4 1 1 1 2 3 1
从上周开始,我一直在寻找的最棘手的矩阵是第三个矩阵,它应该浏览第一个矩阵的每一行,返回每个数字的出现次数和最后一次出现的位置。下面是一个代码应该如何工作的示例。此示例显示了在运行第一个矩阵的第一行之后的预期结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (positions)
1 2
2 2
3 3
4 1
5 2
6 1
7 2
8 1
9 2
10 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (positions)
1 1 2
2 1 2
3 3 6
4 1 1
5 3
6 1 4
7 2 1
8 1 1
9 2 3
10 4
(数字)
此示例显示了运行第一个矩阵的第二行后的预期结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (positions)
1 2
2 2
3 3
4 1
5 2
6 1
7 2
8 1
9 2
10 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (positions)
1 1 2
2 1 2
3 3 6
4 1 1
5 3
6 1 4
7 2 1
8 1 1
9 2 3
10 4
(数字)
因此,所需的矩阵必须从一开始就用零填充,每次运行完第一个矩阵的每一行后,我们将新结果添加到前一行…我相信下面的代码会满足您的所有要求。如果我不明白,你需要更清楚地提出你的问题 注意-我硬编码了一些值/大小。显然,在“真实代码”中,你永远不会这么做
% the bit of code that generates and sorts the initial matrix:
Mp = floor(1+(10*rand(2,20)));
mp1 = sort(Mp, 2);
clc
disp(mp1)
occCount = zeros(size(mp1));
for ii = 1:size(mp1,1)
for jj = 1:size(mp1,2)
if (jj == 1)
occCount(ii,jj) = 1;
else
if (mp1(ii,jj) == mp1(ii,jj-1))
occCount(ii,jj) = occCount(ii, jj-1) + 1;
else
occCount(ii,jj) = 1;
end
end
end
end
% this is the second matrix you asked for
disp(occCount)
% now the third:
big = zeros(10, 20);
for ii = 1:size(mp1,1)
for jj = 1:10
f = find(mp1(ii,:) == jj); % index of all of them
if numel(f) > 0
last = f(end);
n = numel(f);
big(jj, last) = big(jj, last) + n;
end
end
end
disp(big)
请看看这是否真的是您的想法。我正在编辑前面的答案,以检查mp1较大时是否快速,显然是:
N = 20000; M = 200; P = 100;
mp1 = sort([repmat(1:P, M, 1), ceil(P*rand(M,N-P))], 2);
tic
% Initialise output matrices
out1 = zeros(M, N); out2 = zeros(P, N);
for gg = 1:M
% Frequencies of each row
freqs(:, 1) = mp1(gg, [find(diff(mp1(gg, :))), end]);
freqs(:, 2) = histc(mp1(gg, :), freqs(:, 1));
cumfreqs = cumsum(freqs(:, 2));
k = 1;
for hh = 1:numel(freqs(:, 1))
out1(gg, k:cumfreqs(hh)) = 1:freqs(hh, 2);
out2(freqs(hh, 1), cumfreqs(hh)) = out2(freqs(hh, 1), cumfreqs(hh)) + freqs(hh, 2);
k = cumfreqs(hh) + 1;
end
end
toc
下面的代码用一个循环解决了第二个和第三个矩阵生成问题。为清楚起见,第二个矩阵
M2
是示例中包含累计发生次数的2×20
数组。第三个矩阵M3
是示例中大小为10×20
的稀疏矩阵,该矩阵编码每个唯一值最后一次出现的数量和位置。代码仅在行上循环,使用accumarray
完成大部分工作。只要先对行进行排序,就可以将其推广到mp1
的任何大小和内容
% data
mp1 = [1 1 2 2 3 3 3 4 5 5 6 7 7 8 9 9 10 10 10 10;
1 2 3 3 3 3 3 3 4 5 6 6 6 6 7 8 9 9 9 10]; % the example first matrix
nuniq = max(mp1(:));
% accumulate
M2 = zeros(size(mp1));
M3 = zeros(nuniq,size(mp1,2));
for ir=1:size(mp1,1),
cumSums = accumarray(mp1(ir,:)',1:size(mp1,2),[],@numel,[],true)';
segments = arrayfun(@(x)1:x,nonzeros(cumSums),'uni',false);
M2(ir,:) = [segments{:}];
countCoords = accumarray(mp1(ir,:)',1:size(mp1,2),[],@max,[],true);
[ii,jj] = find(countCoords);
nzinds = sub2ind(size(M3),ii,nonzeros(countCoords));
M3(nzinds) = M3(nzinds) + nonzeros(cumSums);
end
我不会打印输出,因为它们对于答案来说有点大,并且代码是可以运行的
注意:对于新的测试数据,我建议使用命令Mp=randi(10[2,20]);mp1=排序(Mp,2)代码>。或者根据您对用户2875617的请求和他的回复,确保所有数字都带有mp1=sort([repmat(1:10,2,1)randi(10,[2,10]),2)代码>但这并不是随机的
编辑:修复了代码中的错误。似乎是一个非常局部的问题。你在乎代码是否超高效吗?“我想修改这段代码,以便得到这样的输出:“不要得到你想要修改的东西?”?代码已经与您的输出匹配。@山姆:您至少已经问了部分问题。你的答案怎么了?你为什么又问同样的问题?你想如何处理“丢失的数字”——当你从{1,10}中抽取20个随机数时会出现这种情况。@Sam既然你在下面的评论中说你在这里得到了你需要的,你能把一个答案标记为已接受吗?或者你可以发布自己的答案并接受它。无论哪种方式都可以接受,尽管我偏爱自己的方式否则人们可能会过来继续工作。谢谢。谢谢大家的帮助,你们真的是美丽的头脑和天才@Daniel R你昨天给我的代码对seconde matrix非常有效,@Floris你的代码完全符合我的想法和解释。第一个矩阵仍然有问题第一个矩阵应该有一个递增顺序的随机数,总是从1开始,总是以10结束,并生成1到10之间的所有数字。上面的代码生成随机数,但有时它从数字2开始,直接跳到数字4,而不生成数字3。这里的问题是,我想控制随机生成器,以便能够填充我想要的第一个矩阵行的示例:1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 SAM,这是不可能的。随机数是随机的,所以你不能确定从1到10的所有数字都会被提取出来。你能做的是:mp1=排序([repmat(1:10,2,1),floor(1+(10*rand(2,10))),2);但是你只有10个随机数,而不是20个。我把所有的代码组合在一起,然后修改它们,以创建适合我工作的东西,现在我的模拟工作非常出色。你救了我的命,也让我节省了很多时间。这里的每个人都应该得到一枚奖章。祝你们大家平安!