如何使用循环机制在表中进行条件计算?

时间:2016-12-31 08:50:19

标签: matlab loops if-statement for-loop

我有下表('ABC'):

enter image description here

目标:对于每个日期,创建2个新变量(例如“LSum”和“USum”)。 'LSum'应计算列宇宙中所有单元格值的总和(4-281),但仅限于其标题位于ABC.L的单元格数组中的那些值,用于该特定日期。以同样的方式,'USum'应计算列中所有单元格值的总和,但仅计算其标题位于ABC.U的单元格数组中的那些值,用于该特定日期。

<?hh
function wait(int $i): Awaitable<void> {
    return Race::wrap(async { await HH\Asio\usleep($i); return $i; });
}
// $wait_handle = null;
class Race {
    public static ?ConditionWaitHandle $handle = null;
    public static async function wrap<T>(Awaitable<T> $v): Awaitable<void> {
        $ret = await $v;
        $handle = self::$handle;
        invariant(!is_null($handle), '');
        $handle->succeed($ret);
    }
}
Race::$handle = ConditionWaitHandle::create(
    \HH\Asio\v(
        Vector{
            (wait(1))->getWaitHandle(), 
            (wait(1000000))->getWaitHandle()
        }
    )
);
printf("%d microsecond `wait` wins!", \HH\Asio\join(Race::$handle));

感谢您的帮助,特别是对于循环播放日期以及同时“L”和“U”的单元格数组。

enter image description here

1 个答案:

答案 0 :(得分:0)

如何避免循环的可能方法是使用rowfun()函数。假设我们有类似于你的表。 enter image description here

使用表变量名称按列扩充表。

tb = horzcat(tb,repmat({tb.Properties.VariableNames},1,height(tb))');

定义应用于每一行的函数。

function out = selectiveSum(varargin)
  [~,~,sumColsId] = intersect(varargin{2},varargin{end});
  out = sum(cell2mat(varargin(sumColsId)));
end

运行rowfun()。

sums = rowfun(@selectiveSum,tb);

该函数只处理一个选择器数组(L列)。添加第二个并让selectiveSum()返回1x2向量。