文件交换的选择

我们最好的用户提交

高效的面向对象的克罗内克积操纵

肖恩 本周的选择 KronProd 通过 马特·J

背景

这个是非常亲爱的老我的心。一些时间在2009年时代,当我从研究生开始,我需要帮助计算亚像素分辨率位移向量两个CT图像之间的卷。位移向量计算的一个主要潜在我大部分的毕业生研究的部分。这是之前 imregcorr 仍然存在,尽管它不支持3 d这是我的要求。万博1manbetx
我设法得到一个2 d变异工作,但需要3 d。马特回答我的新闻广播员帖子讨论算法及其在三维扩展,并指出这是更有效的比使用 克隆亚麻 直接。性能是非常重要的因为我必须计算超过四十亿位移向量在明年。
马特提供了许多算法和超载很多运营商的工作 KronProd 类和配置自定义索引和大小。2009年,我不懂如何自定义索引 subsref / subsasgn /尺寸 超负荷工作,所以它看起来像魔法一样。现在这些工作的知识,和那个时代的性能影响,我可能会把核心算法为速度因为我使用一个函数是无状态的,即一个新的 KronProd 每一次。
这里有一些简单的操作 KronProd 。我们将从三个数组创建一个。
kp = KronProd({魔法(3),(randi (10 4 [3]), 0 (3,1)], randn(9日15)})
kp =
81×225 KronProd数组的属性:opset:{[3×3双][3×5双][9×15双]}opinds: (1 2 3) numops: 3眼膜:[0 0 0]domainset: [3 5 15] maxdim: 3 scalarcoeff: 1 scalarcumprods: [1 1 1] scalarmask: [0 0 0] domainsizes: [3 5 15] rangesizes: [3 3 9]
现在我们可以使用这个好像你会得到完整的扩张 克隆亚麻 函数。
nzeros = nnz (kp)
nzeros = 14580
或一个矩阵操作,我回到KronProds。
[u, v] =圣言(kp)
u =
81×81 KronProd数组的属性:opset:{3×1细胞}opinds: (1 2 3) numops: 3眼膜:[0 0 0]domainset:[3×1双]maxdim: 3 scalarcoeff: 1 scalarcumprods: [1 1 1] scalarmask: [0 0 0] domainsizes: [3 3 9] rangesizes: [3 3 9]
s =
81×225 KronProd数组的属性:opset:{3×1细胞}opinds: (1 2 3) numops: 3眼膜:[0 0 0]domainset:[3×1双]maxdim: 3 scalarcoeff: 1 scalarcumprods: [1 1 1] scalarmask: [0 0 0] domainsizes: [3 5 15] rangesizes: [3 3 9]
v =
225×225 KronProd数组的属性:opset:{3×1细胞}opinds: (1 2 3) numops: 3眼膜:[0 0 0]domainset:[3×1双]maxdim: 3 scalarcoeff: 1 scalarcumprods: [1 1 1] scalarmask: [0 0 0] domainsizes: [3 5 15] rangesizes: [3 5 15]
马特已经超载 subsref 所以当你KronProd指数,你回到KronProd还是矩阵。
kkp = kp (1)
kkp =
3×3 KronProd数组的属性:opset:{[3×3双]}opinds: 1 numops: 1眼膜:0 domainset: 3 maxdim: 1 scalarcoeff: 1 scalarcumprods: 1 scalarmask: 0 domainsizes: 3 rangesizes: 3
公里= kp {1}
公里= 3×3
8 1 6 3 5 7 4 9 2
他不超载 subsasgn 所以我们不能做相反的事情。
试一试
kp{1} =兰德(3)
ME.message流(2)
结束
无法执行任务,因为撑索引不支持这种类型的变量。万博1manbetx
他还超载 大小 这样的外观尺寸是完整的克罗内克积。然而,在底层 KronProd 实际上是一个标量,它只是吗 出现 扩大规模。
深圳=大小(年代)
深圳= 1×2
81 225
从MATLAB R2021b开始,我们现在有一个更容易和更正式的方式控制索引和创建标量对象使用 模块化的索引
现在 subsref 过载(){},点(.)。过载点,只是因为它必须使用旧的方法,所以我们不需要做更新索引。因此,类定义需要行:
classdefKronProd < matlab.mixin.indexing。RedefinesParen & matlab.mixin.indexing.RedefinesBrace
现在,我们需要实现的抽象方法 parenAssign、parenReference braceAssign braceReference 。这些方法将使用类似的逻辑今天使用,在一个受保护的方法,沿着这些思路:
函数B = braceReference (obj indexOp)
(1)第1 = M.opinds (indexOp .Indices {1});
B = M.opset(第1);
如果isnum(第1)
B = B {:};
结束
结束

评论

马特,如果我们满足在现实生活中,我欠你一个啤酒!
试一试,让我们知道你的想法 在这里 或者离开 评论 马特。
|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。