arrays - 按组运行顺序
问题描述
我有一个包含组标识符的矩阵:
A = [ 1 ; 1 ; 2;2;2;3;3]
我想通过按组运行序列来增强这一点,以获得这样的矩阵:
B = [ 1,1 ; 1,2 ; 2,1;2,2;2,3;3,1;3,2]
B =
1 1
1 2
2 1
2 2
2 3
3 1
3 2
如果不使用可怕的 for 循环,我怎么能做到这一点?谢谢!
解决方案
输入包含正整数,不一定是连续的但已排序
[B, ~] = find(sort(sparse(1:numel(A), A, true), 1, 'descend'));
B = [A B];
这工作如下:
- 创建一个中间逻辑稀疏矩阵,列位置由
A
连续行位置确定:sparse(1:numel(A), A, true)
。尽管此矩阵可能很大,但将其创建为稀疏矩阵会使该方法具有内存效率。 - 将
true
每列中的条目移动到矩阵的上部:sort(..., 1, , 'descend')
。 - 行索引包含所需的结果:
[B, ~] = find(...)
。
输入包含正整数,不一定是连续的,不一定是排序的
t = sparse(1:numel(A), A, true);
t = t.*cumsum(t, 1);
B = [A nonzeros(t.')];
这工作如下:
- 像以前一样创建一个中间逻辑稀疏矩阵。
- 在每一列中,用连续值替换非零值
1
,2
, ... - 转置矩阵。线性顺序的非零是期望的结果。
推荐阅读
- java - 排除文件过滤器
- python - python if else 理解两个列表
- swift - 如何从 Facebook 获取用户电子邮件 ID
- intellij-idea - 如何在 IntelliJ 的运行和文档工具窗口中打开新选项卡?
- mysql - Mysql在提供后从下一行开始选择接下来的1000行
- android - MPAndroidChart 如何将信息视图添加到轴?
- ios - 访问字典数组的嵌套数组
- javascript - 使用 axios POST 时出现错误
- ssl - 从 conda 提示符安装任何软件包时出现 SSL 错误
- c# - 设置相对于最后一行文本的光标位置 | C# 控制台应用程序