- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 bsxfun
在大小矩阵之间通过单例扩展对操作进行矢量化:
MS: (nms, nls)
KS: (nks, nls)
运算是对每个值的绝对差求和MS(m,l)
与 m
在1:nms
和 l
在1:nls
, 和每个 KS(k,l)
与 k
在1:nks
.
我是通过代码实现的:
[~, nls] = size(MS);
MS = reshape(MS',1,nls,[]);
R = sum(abs(bsxfun(@minus,MS,KS)));
R
尺寸为 (nls, nms)
.
我想将此操作概括为样本列表,因此新的大小将是:
MS: (nxs, nls, nms)
KS: (nxs, nls, nks)
这可以通过 for 循环轻松实现,该 for 循环为每个二维矩阵执行第一段代码,但我怀疑通过添加新维度来概括以前的代码,性能可能会好得多。
R
有大小:(nxs, nls, nms)
我尝试 reshape MS
到 4 个维度没有成功。这可以通过 reshape 和 bsxfun
来完成吗? ?
最佳答案
你可能需要这个:
% generate small dummy data
nxs = 2;
nls = 3;
nms = 4;
nks = 5;
MS = rand(nxs, nls, nms);
KS = rand(nxs, nls, nks);
R = sum(abs(bsxfun(@minus,MS,permute(KS,[1,2,4,3]))),4)
这将产生一个大小为 [2,3,4]
的矩阵,即 [nxs,nls,nms]
。每个元素[k1,k2,k3]
都会对应
R(k1,k2,k3) == sum_k abs(MS(k1,k2,k3) - KS(k1,k2,k))
例如,在我的随机运行中
R(2,1,3)
ans =
1.255765020150647
>> sum(abs(MS(2,1,3)-KS(2,1,:)))
ans =
1.255765020150647
诀窍是使用permute
引入单一维度:permute(KS,[1,2,4,3])
的大小为[nxs, nls,1,nks]
,而大小为 [nxs,nls,nms]
的 MS
也隐式为大小 [nxs,nls,nms ,1]
:假定 MATLAB 中的每个数组都具有可数无限数量的尾随单维度。从这里很容易看出如何将 bsxfun
大小为 [nxs,nls,nms,1]
和 [nxs,nls,1,nks] 的数组组合在一起
,分别获得一个大小为[nxs,nls,nms,nks]
。沿着维度 4 求和就可以达成协议(protocol)。
我在评论中指出,置换
求和索引放在第一位可能会更快。事实证明,这本身会使代码运行变慢。然而,通过 reshape 数组以减小维度大小,整体性能会提高(由于优化内存访问)。比较一下:
% generate larger dummy data
nxs = 20;
nls = 30;
nms = 40;
nks = 500;
MS = rand(nxs, nls, nms);
KS = rand(nxs, nls, nks);
MS2 = permute(MS,[4 3 2 1]);
KS2 = permute(KS,[3 4 2 1]);
R3 = permute(squeeze(sum(abs(bsxfun(@minus,MS2,KS2)),1)),[3 2 1]);
我所做的是将求和 nks
维度放在第一位,然后将其余维度按降序排列。这可以自动完成,我只是不想使示例过于复杂。在您的用例中,您可能无论如何都知道维度的大小。
上述两个代码的运行时间:原始代码为 0.07028 秒,重新排序的代码为 0.051162 秒(5 个中最好的)。不幸的是,更大的例子现在不适合我的内存。
关于matlab - 将 bsxfun 与具有三维矩阵的单例扩展一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777775/
我有一个二元函数,大致看起来像 func=@(i,j)exp(-32*(i-j)^2); 网格如下 [X Y]=meshgrid(-10:.1:10); 奇怪的是,arrayfun 会产生正确的结果,
这是做什么的? u = [5 6]; s = [1 1]; data1 =[randn(10,1) -1*ones(10,1)]; data2 =[randn(10,1) ones(10,
在 Matlab R2016a 中,我有一大组成对的小 X 向量和 Y 向量(例如,10,000 个 1x3 X 向量与 10,000 个 1x3 Y 向量配对)。对于每个 {X,Y} 对,我想为 X
我有两组(50 个训练和 25 个测试)大小为 42 的直方图集。(这些数字是任意的,它们在现实中会更大,所以我正在寻找一种有效的方法。而且约定可能是相反的在转置方面,请随意使用任何约定 [featu
我主要使用 bsxfun 对我的代码进行矢量化,但我遇到了一个我无法完全破解的场景。这是一个小问题示例。我想删除此代码中的 for 循环,但我很难处理 tempEA 行。 Index = [2; 3;
这里主要想研究两点- bsxfun 有六个内置关系运算:@eq (equal)、@ne(不等于)、@lt(小于)、 @le(小于或等于)、@gt(大于) 和 @ ge(大于或等于)。很多时候我们将它们
我有一个问题。我正在尝试实现这段简短的代码。 我已经完成了基本步骤。请在下面检查我的代码: clc;clear all;close all; A=round(-3+(6).*rand(5,5)); B
我想将逐个元素的二元运算应用于大型逻辑向量。这些向量的内容是错误的,因此出于性能考虑,最好使用稀疏矩阵。如果我这样做,结果矩阵是不正确的。 例子 A = logical([0;1;0;0]); B =
我正在做一个关于神经网络的项目,我的工作介质是 Matlab。运行以下代码时: net=train(net, feat_mat, gt_mat); 我使用的神经网络是具有 3 个隐藏层的 ffnn。
假设我有 2 个向量,我想做一个外积。我可以使用: A=x*y'; 或者我可以像这样使用bsxfun: bsxfun(@times,x,y') 但我想批量生产外部产品。我有 2 个矩阵,每个矩阵都包含
我在 MATLAB 中有两个数组: A; % size(A) = [NX NY NZ 3 3] b; % size(b) = [NX NY NZ 3 1] 事实上,在三维域中,我为每个 (i, j,
在尝试理解 bsxfun 函数后,我尝试在脚本中实现它以避免循环。我试图检查数组中的每个单独元素是否包含在一个矩阵中,返回一个与分别包含 1 和 0 的初始数组大小相同的矩阵。我创建的匿名函数是: m
我正在使用 bsxfun在大小矩阵之间通过单例扩展对操作进行矢量化: MS: (nms, nls) KS: (nks, nls) 运算是对每个值的绝对差求和MS(m,l)与 m在1:nms和 l在1:
使用 MATLAB,想象一个 Nx6 的数字数组,它代表 N 个具有 3+3=6 个起始点和终点坐标的线段。 假设我有一个 function Calc_Dist( Segment_1, Segment
对于非数字数据,是否有等价于 bsxfun 的方法? 例如,我想比较存储在两个元胞数组中的所有字符串对: >> a = {'aa', 'bb', 'cc'}; >> b = {'dd', 'aa'};
我需要将矩阵 A 与 n 个矩阵相乘,然后得到 n 矩阵。例如,将 2x2 矩阵与 3 个堆叠为 2x2x3 Matlab 数组的 2x2 矩阵相乘。 bsxfun 是我通常在这种情况下使用的,但它只
在我的工作(计量经济学/统计学)中,我经常需要将不同大小的矩阵相乘,然后对生成的矩阵执行其他操作。我一直依靠 bsxfun() 来矢量化代码,总的来说我发现它比 repmat() 更有效。但我不明白的
一如既往地想向您学习更多信息,我希望我能在以下代码方面得到一些帮助。 我需要完成以下任务: 1) 我有一个向量: x = [1 2 3 4 5 6 7 8 9 10 11 12] 2) 和一个矩阵:
我有一个 double 的 2092x252 矩阵s 并且需要创建一个 for使用 bsxfun 的循环.对于这个例子,我们只说bsxfun(@minus) .我需要循环完成的是运行 bsxfun(@
从 bsxfun 的 Matlab 文档中给出了一个示例: fun = @(A,B) A.*sin(B); A = 1:7; B = pi*[0 1/4 1/3 1/2 2/3 3/4 1].'; %
我是一名优秀的程序员,十分优秀!