我有下表('ABC'):
目标:对于每个日期,创建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”的单元格数组。
答案 0 :(得分:0)
如何避免循环的可能方法是使用rowfun()函数。假设我们有类似于你的表。
使用表变量名称按列扩充表。
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向量。