对于矢量化在MATLAB循环

我不太知道这是可能的,但我MATLAB的理解肯定可以做得更好。

我有一些代码,我想向量化,因为它是造成相当多的瓶颈,在我的计划。 这其中有短期平均值(STA),长期平均值(LTA)和灵敏度(OnSense)的许多可能的配置运行通过优化日常工作的一部分。

时间矢量格式,FL2onSS是主数据(NX1双),FL2onSSSTA是其STA(NxSTA双),FL2onSSThresh是它的阈值(NxLTAxOnSense双)

我们的想法是,以计算红色报警矩阵,这将是4D - 用于整个程序的其余部分的alarmStatexSTAxLTAxOnSense。

Red = zeros(length(FL2onSS), length(STA), length(LTA), length(OnSense), 'double'); for i=1:length(STA) for j=1:length(LTA) for k=1:length(OnSense) Red(:,i,j,k) = calcRedAlarm(Time, FL2onSS, FL2onSSSTA(:,i), FL2onSSThresh(:,j,k)); end end end

目前我已经得到了这个,试图得到更多的速度出来的重复功能,但显然这将是,如果整个事情可以矢量化更好。 换句话说,我并不需要保持的功能,如果有一个更好的解决方案。

function [Red] = calcRedAlarm(Time, FL2onSS, FL2onSSSTA, FL2onSSThresh) % Calculate Alarms % Alarm triggers when STA > Threshold zeroSize = length(FL2onSS); %Precompose Red = zeros(zeroSize, 1, 'double'); for i=2:zeroSize %Because of time chunks being butted up against each other, alarms can %go off when they shouldn't. To fix this, timeDiff has been %calculated to check if the last date is different to the current by 5 %seconds. If it isn't, don't generate an alarm as there is either a %validity or time gap. timeDiff = etime(Time(i,:), Time(i-1,:)); if FL2onSSSTA(i) > FL2onSSThresh(i) && FL2onSSThresh(i) ~= 0 && timeDiff == 5 %If Short Term Avg is > Threshold, Trigger Red(i) = 1; elseif FL2onSSSTA(i) < FL2onSSThresh(i) && FL2onSSThresh(i) ~= 0 && timeDiff == 5 %If Short Term Avg is < Threshold, Turn off Red(i) = 0; else %Otherwise keep current state Red(i) = Red(i-1); end end end

该代码是很简单的,所以我不会再解释任何。 如果你需要澄清什么特定行是干什么的,让我知道。

--------------解决方案-------------

诀窍是把所有的数据,以同样的形式 ,主要使用repmat置换 。 则逻辑是简单的一部分。

我需要很下流的手段来实现的最后一部分(如果没有的条件成立,用最后的结果)。 通常那种逻辑,是使用一个cumsum。 我只好用2 ^ N另一个矩阵,以确保定义使用(这样+ 1,+ 1,-1将真正给1,1,0)的值 - 只要看看代码:)

%// define size variables for better readability
N = length(Time);
M = length(STA);
O = length(LTA);
P = length(OnSense);

%// transform the main data to same dimentions (3d matrices)
%// note that I flatten FL2onSSThresh to be 2D first, to make things simpler.
%// anyway you don't use the fact that its 3D except traversing it.
FL2onSSThresh2 = reshape(FL2onSSThresh, [N, O*P]);
FL2onSSThresh3 = repmat(FL2onSSThresh2, [1, 1, M]);
FL2onSSSTA3 = permute(repmat(FL2onSSSTA, [1, 1, O*P]), [1, 3, 2]);
timeDiff = diff(datenum(Time))*24*60*60;
timeDiff3 = repmat(timeDiff, [1, O*P, M]);
%// we also remove the 1st plain from each of the matrices (the vector equiv of running i=2:zeroSize
FL2onSSThresh3 = FL2onSSThresh3(2:end, :, :);
FL2onSSSTA3 = FL2onSSSTA3(2:end, :, :);

Red3 = zeros(N-1, O*P, M, 'double');

%// now the logic in vector form
%// note the chage of && (logical operator) to & (binary operator)
Red3((FL2onSSSTA3 > FL2onSSThresh3) & (FL2onSSThresh3 ~= 0) & (timeDiff3 == 5)) = 1;
Red3((FL2onSSSTA3 < FL2onSSThresh3) & (FL2onSSThresh3 ~= 0) & (timeDiff3 == 5)) = -1;
%// now you have a matrix with +1 where alarm should start, and -1 where it should end.

%// add the 0s at the begining
Red3 = [zeros(1, O*P, M); Red3];

%// reshape back to the same shape
Red2 = reshape(Red3, [N, O, P, M]);
Red2 = permute(Red2, [1, 4, 2, 3]);

%// and now some nasty trick to convert the start/end data to 1 where alarm is on, and 0 where it is off.
Weights = 2.^repmat((1:N)', [1, M, O, P]); %// ' damn SO syntax highlighting. learn MATLAB already!
Red = (sign(cumsum(Weights.*Red2))+1)==2;

%// and we are done.
%// print sum(Red(:)!=OldRed(:)), where OldRed is Red calculated in non vector form to test this.

分类:matlab 时间:2012-01-01 人气:0
本文关键词: 性能,MATLAB,矢量
分享到:

相关文章

  • 如何写MATLAB矢量功能 2012-08-30

    我刚学MATLAB,我觉得很难理解循环VS矢量功能的性能因素. 在我刚才的问题:嵌套的for循环在MATLAB非常慢(预分配的),我意识到,使用矢量功能比4嵌套循环取得了运行时间7倍倍差异. 在该实施例,而不是通过一个4维阵列的所有维度循环,并为每个矢量计算中值,这是更清洁,更快速地只是调用中位数(堆栈中,n),其中n指中值函数的工作尺寸. 但中位数只是一个非常简单的例子,我只是幸运,它有这个维度参数实现的. 我的问题是, 你如何编写一个函数,它自己尽可能高效工程为一体已经此尺寸范围内实施? 例

  • 从阅读txt文件值在Matlab矢量 2012-01-15

    我有一个文本文件,其中包含在文本文件中的每一行的不同列的数据量. 我的数据是在格式如下: 2 21 2623 707 40 1 在一排有三个数字后的数据保持在相同的结构,直到文件的末尾. 我要处理的数据,使我有三个矢量X,Y和Z,它包含来自具有三个数字的行中的值,以便: X = 707 Y = 40 Z = 1 非常感谢! --------------解决方案------------- 假设行忽略的数目不恒定,你想这样做编程,而不是使用导入向导,你首先需要弄清楚有多少行,不容忽视. 一种方法来完

  • 双总和与在Matlab矢量循环 2012-05-13

    我想向量化这种双重循环,因为它是在我的代码的瓶颈. 由于Matlab是一个基于一的索引语言,我必须创造一个M = 0的附加项. R,R,拉姆达是常数 SLM(L,M),CLM(L,M)是矩阵70x70 PLM(L,M)是一个矩阵70x71 CL(L),PL(L)是向量70x1 % function dU_r s1 = 0; for L = 2:70 s1 = s1 + ((R/r)^L)*(L+1)*Pl(L)*Cl(L); for m = 1:L s1 = s1 + ((R/r)^L)*(L+

  • MATLAB矢量化功能 2012-10-24

    我有超过M = 1张总和:M 和 N = 1:N的坐标RHO, 披 ,Z极点: 我写它的矢量符号: N = 10; M = 10; n = 1:N; m = 1:M; rho = 1; phi = 1; z = 1; summ = cos (n*z) * besselj(m'-1, n*rho) * cos(m*phi)'; 现在,我需要重写这个函数接受向量(列)坐标RHO,披,Z. 我试过arrayfun,cellfun,简单的for循环 - 他们的工作速度太慢我. 我知道"MATLAB数组操

  • 代表MATLAB矢量值函数 2012-11-26

    什么是翻译以下简短的Python / numpy的代码,以MATLAB的最佳方式 from numpy import * F = lambda x, y: (-y, x) points = array(meshgrid([1,2,3], [4,5,6,7])) vx, vy = F(*points) print vx, vy 在上面的代码中, F意在表示一矢量值的速度场. Specfically,应该向量值函数中使用的细胞来表示,或有更好的方式来做到这一点? 翻译上面的代码第一次尝试: F =

  • 在Matlab矢量信号的相关性 2013-02-06

    我想计算矢量(单声道信号)的在Matlab中的相关性. 到目前为止,我知道,这应该是给相关矩阵,但在Matlab我不觉得这给了我一个矩阵的功能. Xcorr()给出的载体. 因此,如果有人知道我将不胜感激. 商祺 --------------解决方案------------- 你可能会寻找corrcoef功能: corrcoef(rand(10,1),rand(10,1)) ans = 1.0000 -0.2110 -0.2110 1.0000 一时间系列,相关性被定义为一个矢量. 也许你想是这

  • 在利用MATLAB矢量查找最大值 2014-08-08

    我试图找到利用MATLAB数字向量的局部最大值. 内置findpeaks功能可以为载体如工作: [0 1 2 3 2 1 1 2 3 2 1 0] 其中峰(每个的3的)只占据了载体一个位置,但如果我有一个像向量: [0 1 2 3 3 2 1 1 2 3 2 1 0] 第一个"高峰"占据了矢量两个位置和findpeaks功能将不会把它捡起来. 有没有写一个极大调查功能,将检测这有点峰的一个很好的方式? --------------解决方案------------- 您可以使用从图像处理

  • 嵌套循环MATLAB矢量 2012-03-31

    嗨,我用MATLAB vactorization挣扎有这方面的帮助将是巨大的感谢. oldLocation , Limit_都是矩阵 for i=1:250 for j=1:350 temp= oldLocation(i,j,:)./Limit_(i,j,:); end end --------------解决方案------------- 只需直接进行分工. 当然,你需要适应下面的代码(除非你把覆盖temp ) temp = oldLocation./Limit_;

  • 找到唯一索引在MATLAB矢量? 2012-06-19

    我有一个向量M有多个重复的可能性,我想创建忽略所有重复的索引向量. 我试过[C,ia,ib] = unique(M)但我不太知道如何使用IA和IB. 编辑:对不起,我错过了一个重要的细节, I是一个现有的索引向量,它需要摆脱包含重复值的所有指标. 所以原来的矢量看起来像M(I)我想'清理'了I ,我要是直接IA =我不会保留一的原始数据 --------------解决方案------------- 从http://www.mathworks.co.uk/help/techdoc/ref/uni

  • MATLAB矢量不同阵列 2014-05-19

    谁能告诉我是什么在背后矩阵相对于不同的行或列的行/列数的基本思想是在Matlab? 我一直在试图通过替换一个给定矩阵的所有列 i=1:101; V=ones(121,101); V_t=1000*10.^((i-1)/20); e=V_arr(1:121)'; V_arr=V; V_arr(:,i)=V_t*e; 我知道错误出在试图对所有行替换的列数,我已经使用repmat看到另一种选择,更简单的方法,但我想知道是否有类似于上面的一个方法. 谢谢. --------------解决方案-----

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.413 (s). 10 q(s)