如何对单元格的元素进行排序?

2023-11-25

我有一个像这样的细胞:

A{1,1}=[ 1 ;2; 3;];
A{2,1}=[ 4 ;2;];
A{3,1}=[ 3 ;2; 5; 4; 6;];
...
A{N,1}=[ 10 ;2;5; 7;];   %N is very large.

换句话说,这个单元格的每个元素的列数是不同的,没有明确的模式。

现在,我想根据位于的元素对这些元素进行排序第一栏。我的意思是,我希望结果是这样的:

Asorted{1,1}=[ 1 ;2; 3;];
Asorted{2,1}=[ 3 ;2; 5; 4; 6;];
Asorted{3,1}=[ 4 ;2;];
...
Asorted{N,1}=[ 10 ;2;5; 7;];

目前我使用这个功能:

function Asorted = sortcell(A)
B=[];
nrows = size(A,1);

for i=1:nrows            % this for-loop is slow
    st=A{i,1};
    B(i,1) = st(1,1);
end
[sorted,indices] = sort(B);
Asorted = A(indices,:);
end 

它有效,但需要很多时间。事实上for循环部分非常慢。
我读到了 cat 函数,但我不知道如何使用它。我用了B = cat(1,A{:}(1,1));,但是有这个错误:??? Bad cell reference operation.

我想知道是否有更快的方法来做到这一点?

Thanks.

Update我们来做一个实验:

A={};
for i=1:1e3
    A{i,1} = ones(4,1) * randn;
end

N=1000;sum1=0;sum2=0;sum3=0;sum4=0;
for t=1:N

    % # Solution with for loop and no prealocation
    tic
    B = [];
    for i = 1:size(A, 1)
        B(i, 1) = A{i,1}(1,1);
    end
    [Y, I] = sort(B);
    Asorted = A(I,:);
    a=toc;sum1=sum1+a;

    % # Solution with for loop and Prealocation
    tic
    B = zeros(size(A,1), 1);
    for i = 1:size(A, 1)
        B(i, 1) = A{i,1}(1,1);
    end
    [Y, I] = sort(B);
    Asorted = A(I,:);
    a=toc;sum2=sum2+a;

    % # Solution with cellfun
    tic
    [Y, I] = sort( cellfun( @(x) x(1), A ) );
    Asorted = A(I);
    a=toc;sum3=sum3+a;
    tic

    % # Solution with for loop and ???
    for i = 1:size(A, 1)
        B(i, 1) = A{i}(1);
    end
    [Y, I] = sort(B);
    Asorted = A(I);
    a=toc;sum4=sum4+a;
end

结果是
总和1=2.53635923001387
总和2=0.629729057743372
sum3=4.54007401778717
sum4=0.571285037623497

** 这意味着每次分配更快,但第四种方法是什么。我认为它值得在一个单独的问题中讨论。看Matlab预分配与不分配,第二种更快,为什么?


你的循环很慢,因为B正在里面生长;你应该预先分配内存B它应该运行得更快。为此,请在for loop:

B = zeros(nrows, 1);

您可以进一步缩短循环,如下所示:

B = zeros(size(A,1), 1);
for i = 1:size(A, 1)
    B(i, 1) = A{i}(1);
end
[Y, I] = sort(B);
Asorted = A(I);

EDIT

我决定将此解决方案与采用的较短解决方案进行比较cellfun(我以前提出过):

A = {[1; 2; 3], [4; 2], [3; 2; 5; 4; 6], [10; 2; 5; 7]};

% # Solution with a for loop
tic
for jj = 1:1e3
    B = zeros(size(A,1), 1);
    for i = 1:size(A, 1)
        B(i, 1) = A{i}(1);
    end
    [Y, I] = sort(B);
    Asorted = A(I);
end
toc

% # Solution with cellfun
tic
for jj = 1:1e3
    [Y, I] = sort( cellfun( @(x) x(1), A ) );
    Asorted = A(I);
end
toc

结果是:

Elapsed time is 0.028761 seconds.
Elapsed time is 0.253888 seconds.

循环的运行速度比cellfun!对于大型数组,这种差异可能非常明显,因此我建议使用for在这个问题中循环。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对单元格的元素进行排序? 的相关文章

随机推荐

  • C++ 声明中的“&”有什么作用?

    我是一个 C 人员 我正在尝试理解一些 C 代码 我有以下函数声明 int foo const string myname cout lt lt called foo for lt lt myname lt lt endl return 0
  • Rails 4 Devise 3.1.1 Devise::RegistrationsController#new 中的 ActionController::UnknownFormat

    我正在开发一个 Rails 4 应用程序 使用 Devise 3 1 1 进行用户身份验证 当我单击 users sign up user 链接时 Rails 抛出以下异常 ActionController UnknownFormat in
  • 将发送的短信写入 content://sms/sent 表

    我正在开发一个 android 短信应用程序 我可以使用以下代码向单个联系人发送短信 sms sendTextMessage phoneNumber null message sentPI deliveredPI 现在我想向多重联系人发送短
  • Kibana 直方图 - 在单个图表上绘制多个系列

    我在 Elasticsearch 中有一个索引 其中包含一个简单对象数组 键值请参见下面的示例 这些文档有时间戳 我可以在 Kibana 中为每个键值创建单独的直方图 即一个图表用于 bytes sent 另一个图表用于 bytes rec
  • Angular 2 的 JSPM 与 WebPack

    最近我在我的 Angular 2 项目中使用了 JSPM 发现它使用起来非常简单和方便 无论是添加新模块还是创建用于生产的捆绑包 基本上就是 jspm install npm angular somepackage package json
  • 在 Web 应用程序中显示 PDF

    我已经用谷歌搜索了这个 搜索了这个 浏览了SO和其他网站 我已经尝试阅读这个问题几个小时了 但我似乎仍然找不到一个令人满意的解决方案来解决这个看似简单的问题 常见的编程问题 让我来设定一下场景 我有一个网站 Web 应用程序 允许用户搜索
  • python opencv imwrite ...找不到参数

    我正在使用 opencv 和 python 我想做一个 cv2 imwrite cv2 imwrite myimage png my im 唯一的问题是 opencv 无法识别 params 常量 cv2 imwrite myimage p
  • 使用内置“crypto”在nodejs中进行密码散列

    仅使用内置函数在 Node js 中实现密码哈希和验证的最佳方法是什么crypto模块 基本上需要什么 function passwordHash password gt passwordHash function passwordVeri
  • 光线投射引擎渲染产生轻微的扭曲,朝向屏幕边缘逐渐增加

    我正在为 HTML5 画布开发一个基本的光线投射引擎 该引擎在 Wolfenstein 3D 和 Doom 等游戏中使用 作为学习练习 爱好项目 我已经到了使用纹理映射在画布上渲染墙壁的地步 经过相当多的努力使相交测试功能正确后 效果非常好
  • PDFsharp 水印

    我正在制作一个应用程序 在用户选择的 PDF 上创建水印 但我似乎无法让水印出现在所选 PDF 上 但也没有收到任何错误 任何帮助 将不胜感激 我使用的是 PDFsharp 版本 1 50 4000 public void WaterMar
  • 是否可以从不同的 JVM 调用 Java 应用程序中的方法?

    当我第一次使用 Apache 守护程序为 Windows 开发 Java 服务时 我使用了JVM我非常喜欢的模式 您指定您的类和启动 停止 静态 方法 但对于 Linux Jsvc 看起来并没有相同的选项 我真的很想知道为什么 无论如何 如
  • AVPlayer 中的 SeekToTime 在前进时停止播放流音频

    我使用 AVPlayer 流式传输音频 它运作良好 但现在我需要制作一个滑块来向前和向后移动音频 就像典型的音乐播放器一样 我使用了该功能seekToTime这与本地音频文件配合得很好 但是 当我从 Web url 流式传输歌曲时 当我将滑
  • 如何更改 ASP.NET 图表控件的背景颜色?

    渲染图表控件时 图像的背景颜色为白色 我怎样才能使它成为另一种颜色 或透明 我指的区域是黑色边框和图表背景之间的白色区域 尝试这个
  • 可以将未命名的结构设为静态吗?

    您可以将未命名的结构设为类的静态成员吗 struct Foo struct namedStruct int memb1 memb2 static namedStruct namedStructObj struct int memb1 mem
  • 如何在按角度单击按钮时将列表滚动到顶部?

    您能告诉我如何在按角度单击按钮时将列表滚动到顶部吗 我试过这样 scrollToTop el el scrollIntoView
  • 在 C++ 中获取环 0 模式 (Windows)

    如何在 Windows 7 或 Vista 中为我的进程获取 Ring 0 操作模式 允许任意代码在环 0 中运行违反了基本的操作系统安全原则 只有OS内核和设备驱动程序运行在ring 0中 如果要编写ring 0代码 请编写Windows
  • 计算 R 中唯一的分类变量对[重复]

    这个问题在这里已经有答案了 如果我有这个数据 One lt c rep X 4 rep Y 3 rep Z 2 Two lt c rep A 2 rep B 6 rep C 1 df lt data frame One Two One Tw
  • 将策略定义与执行分离时了解 Polly 策略的语义

    With Polly我希望在两个不同的语句中定义我的策略并执行该策略 如下所示 Policy definition var policy Policy HandleResult
  • 解决 paramiko 上的线程清理问题

    我有一个使用 paramiko 的自动化流程 但出现以下错误 Exception in thread Thread 1 most likely raised during interpreter shutdown
  • 如何对单元格的元素进行排序?

    我有一个像这样的细胞 A 1 1 1 2 3 A 2 1 4 2 A 3 1 3 2 5 4 6 A N 1 10 2 5 7 N is very large 换句话说 这个单元格的每个元素的列数是不同的 没有明确的模式 现在 我想根据位于