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个。我把所有的代码组合在一起,然后修改它们,以创建适合我工作的东西,现在我的模拟工作非常出色。你救了我的命,也让我节省了很多时间。这里的每个人都应该得到一枚奖章。祝你们大家平安!