- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我发现了几个关于向量化和加速在单个循环中将矩阵和向量相乘的例程的问题/答案,但我正在尝试做一些更一般的事情,即将任意数量的矩阵相乘,并且然后执行该操作任意次数。
我正在编写一个通用例程来计算任意层数的薄膜反射与光频率的关系。对于每个光频率 W
,每一层都有一个折射率 N
和一个关联的 2x2 传输矩阵 L
和 2x2 接口(interface)矩阵 I
这取决于折射率和层的厚度。如果 n
是层数,而 m
是频率数,那么我可以将索引矢量化为 n x m 矩阵,但是为了计算反射每个频率,我都必须做嵌套循环。由于我最终将其用作试衣程序的一部分,因此我将不胜感激我能做些什么来加快速度。
这应该提供一个最低限度的工作示例:
W = 1260:0.1:1400; %frequency in cm^-1
N = rand(4,numel(W))+1i*rand(4,numel(W)); %dummy complex index of refraction
D = [0 0.1 0.2 0]/1e4; %thicknesses in cm
[n,m] = size(N);
r = zeros(size(W));
for x = 1:m %loop over frequencies
C = eye(2); % first medium is air
for y = 2:n %loop over layers
na = N(y-1,x);
nb = N(y,x);
%I = InterfaceMatrix(na,nb); % calculate the 2x2 interface matrix
I = [1 na*nb;na*nb 1]; % dummy matrix
%L = TransferMatrix(nb) % calculate the 2x2 transfer matrix
L = [exp(-1i*nb*W(x)*D(y)) 0; 0 exp(+1i*nb*W(x)*D(y))]; % dummy matrix
C = C*I*L;
end
a = C(1,1);
c = C(2,1);
r(x) = c/a; % reflectivity, the answer I want.
end
针对具有 2562 个频率的三层(空气/物质/基质)问题的两个不同极化运行此两次需要 0.952 秒,而使用三层系统的显式公式(矢量化)解决完全相同的问题需要 0.0265 秒。问题是超过 3 层时,显式公式很快变得难以处理,我必须为每个层数设置不同的子例程,而上面的是完全通用的。
是否有希望对该代码进行矢量化或以其他方式加速它?
(编辑添加我在代码中遗漏了几件事以缩短它,所以请不要尝试使用它来实际计算反射率)
编辑:为了清楚起见,I
和L
对于每个层和每个频率都是不同的,因此它们在每个循环中都会发生变化。简单地取指数是行不通的。对于真实世界的例子,以最简单的空气中的肥皂泡为例。共有三层(空气/肥皂/空气)和两个界面。对于给定的频率,完整的传输矩阵 C
是:
C = L_air * I_air2soap * L_soap * I_soap2air * L_air;
和I_air2soap ~= I_soap2air
。因此,我从 L_air = eye(2)
开始,然后向下连续层,计算 I_(y-1,y) 和 L_y,将它们与前一个循环的结果相乘,然后继续直到我到达堆栈的底部。然后我获取第一个和第三个值,取比率,这就是该频率下的反射率。然后我转到下一个频率并重新做一遍。
我怀疑答案会以某种方式涉及每一层的 block 对角矩阵,如下所述。
最佳答案
不在 matlab 旁边,所以这只是一个入门,您可以将 na*nb
写成 Nab=N(1:end-1,:).*N(2:end,:);
而不是双循环指数 nb*W(x)*D(y)
中的项可以写成 e=N(2:end,:)*W'*D;
I*L
的结果是一个 2x2 block 矩阵,其形式如下:
M = [1, Nab; Nab, 1]*[e-, 0;0, e+] = [e- , Nab*e+ ; Nab*e- , e+]
e-
为 exp(-1i*e),e+
为 exp(1i*e)'
请参阅 kron
了解如何获得 block 矩阵形式,以矢量化传播 C=C*I*L
只需取 M^n
关于matlab - 将任意数量的矩阵乘以任意次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15533391/
你好,我有一张 table : from | to | item | count ------- Jack | Danie| food | 10 Danie| Maria| food | 2 Ja
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试解决以下面试问题 Given two arrays firstDay and lastDay representing the intervals in days of possible m
这个问题已经有答案了: Explanation of a output of a C program involving fork() (2 个回答) 已关闭 9 年前。 这是我从我的研究所去年的试卷
如何在 html 页面上重复一个 div X 次,可以说我想设置方差来声明重复次数。重复这个部分 5 次,我假设它是用 JS 的。 black BLUE WHITE strip 我
我目前使用类中的函数将数据插入数据库,如果每行成功插入(从 csv 文件),则会记录一条消息(logMessage 函数),以显示哪一行成功或失败。但是我想要已导入数据库的成功执行的计数。我遇到了一些
这个问题可能看起来非常基础,但我很难弄清楚如何做。我有一个整数,我需要使用 for 循环来循环整数次。 首先,我尝试了—— fn main() { let number = 10; // An
我正在准备 CS 125 期末考试,其中(简要地)介绍了 Big O Notation。 鉴于: Mergesort 的最佳运行时间为 O(N lg(N)),最坏运行时间为 O(N lg (N)) 有
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我正在构建一个简单的程序来计算骰子实验中数字的频率,但我尝试扩展它并将最大 throw 次数增加到巨大的数字,通过反复试验,我发现最大限制为519253。 使用这个最大值,我也无法创建任何新数组,它会
这是一道面试题 There is an airline company that wants to provide new updates to all of its flight attendant
我正在尝试以一种可以节省我无数小时的繁琐数据输入的方式实现 Excel 自动化。这是我的问题。 我们需要为所有库存打印条形码,其中包括 4,000 种型号,每种型号都有特定数量。 Shopify是我们
我想根据给定的预定义级别(从级别 1 到级别 6)分离代码中的所有内容,现在我的 JSON 读取 $scope.myJson=[{ id: 1, level: 1, name: "any
我创建了一个菜单,它使用一些 CSS 和 jquery 在悬停时显示其子菜单。事情是,如果用户在菜单项上多次悬停,它会有点滑稽。这是网址:http://91.202.168.37/~ibi/ ,这是
假设我对每小时的事件数进行了如下统计: np.random.seed(42) idx = pd.date_range('2017-01-01', '2017-01-14', freq='1H') df
我想确保我正确理解了这个概念: 在 Hadoop 权威指南中指出:“设计文件系统的目标始终是减少与要传输的数据量相比的查找次数。”在此声明中,作者指的是 Hadoop 逻辑 block 的“seeks
我有一个用 C++11 编写的程序,我想计算 std::vector 的 move 和复制(构造和赋值)次数。对象。有办法吗? 最好的问候 最佳答案 否。 std::vector<>的执行没有办法做到
我们组织的帐户空间不足,我们一直在尝试剔除一些较旧的存储库。问题在于一些较旧的存储库可能仍然是事件服务的依赖项(即使它们多年未更新)。 我知道我们可以跟踪克隆,但据我所知,我们看不到直接下载/pull
我是一名优秀的程序员,十分优秀!