高效的面向对象Kronecker产品操作
背景
这张很老了,对我来说很珍贵。在2009年的某个时候,当我开始读研究生时,我需要帮助计算两个CT图像体之间的亚像素分辨率位移向量。位移矢量计算是我大部分研究生研究的主要基础部分之一。这是之前
imregcorr
虽然它仍然不支持3D,这是我的要求。金宝app
我已经成功制作了2D版本,但还需要3D版本。Matt回复了我的新闻阅读器帖子,讨论了算法和它的3D扩展,并指出这比使用更有效
克隆亚麻
直接。性能很重要,因为在接下来的一年里我必须计算超过40亿个位移向量。
Matt提供了许多算法,并重载了一堆运算符
KronProd
类并使用自定义索引和大小配置它。在2009年,我不明白自定义索引如何
subsref
/
subsasgn /尺寸
超负荷运转,就像变魔术一样。现在我知道这些算法是如何工作的,以及在那个时代的性能影响,我可能会为了速度而将核心算法引入一个函数,因为我的使用是无状态的,即一个新的
KronProd
每一次。
这里有一些简单的操作
KronProd
.我们将从三个数组中创建一个。
kp = KronProd({魔法(3),(randi (10 4 [3]), 0 (3,1)], randn(9日15)})
现在我们可以用它来工作就像你从
克隆亚麻
函数。
nzeros = nnz (kp)
nzeros = 14580
或者做矩阵运算,得到克朗探针。
[u, s, v] = svd(kp)
马特已经超载
subsref
所以当你索引到KronProd时,你会得到一个KronProd或者矩阵。
kkp = kp (1)
公里= kp {1}
他没有超负荷工作
subsasgn
但是,我们不能反其道而行之。
试一试
kp{1} =兰德(3)
抓我
ME.message流(2)
结束
他还超载
大小
所以外观尺寸是完整的克罗内克产品。然而,在引擎盖下
KronProd
是标量吗
出现
为扩展后的大小。
深圳=大小(年代)
现在
subsref
重载(),{}和dot(.)。它重载点,因为它与老方法有关,所以新索引不需要这样做。所以类定义行需要是:
classdefKronProd < matlab.mixin.index . redefinesaren & matlab.mixin.index . redefinesbrace
现在,我们需要实现的抽象方法
parenAssign, parenReference, braceAssign, braceReference
.这些方法将使用类似于今天使用的逻辑,在protected方法块中,大致如下:
函数B = braceference (obj, indexOp)
(1)第1 = M.opinds (indexOp .Indices {1});
B = M.opset(第1);
如果isnum(第1)
B = B {:};
结束
结束
评论
马特,如果我们在现实生活中见面,我欠你一杯啤酒!
评论
要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。