0

我是一名初级程序员,主要是自学成才。我是 MATLAB 和关系数学的新手。目前,我正在尝试在行之间执行数学运算。我想exp通过相应的标准化con,然后乘以常数。

constant是一个实验室测量,可能会在未来的实验中发生变化。因此,我给了它一个专栏。

下面是我生成的一些示例代码,用于说明我的问题和解决方案。我正在尝试从myTablerTable

我认识到我的解决方案非常草率,必须有一种方法来执行这些操作,这种操作是人类可读的并且使用较少的临时变量。简而言之,必须有一个更简单的方法。

rTable = table();
myTable = table(transpose(1:8), ...
                transpose({'Con1', 'Con2', 'Exp1', 'Exp2',...
                           'Con1', 'Con2', 'Exp1', 'Exp2'}),...
                transpose({'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'}),...
                ones(8, 1) * 2,...
                'VariableNames', {'Values' , 'Condition', 'Group', 'Constant'});

[r, c] = size(myTable)

a = myTable(strcmp(myTable.Group, 'A'), :);
b = myTable(strcmp(myTable.Group, 'B'), :);

aexp1 = a.Values(strcmp(a.Condition, 'Exp1'), :) / a.Values(strcmp(a.Condition, 'Con1'), :) * mean(a.Constant);
aexp2 = a.Values(strcmp(a.Condition, 'Exp2'), :) / a.Values(strcmp(a.Condition, 'Con2'), :) * mean(a.Constant);

bexp1 = b.Values(strcmp(b.Condition, 'Exp1'), :) / b.Values(strcmp(b.Condition, 'Con1'), :) * mean(b.Constant);
bexp2 = b.Values(strcmp(b.Condition, 'Exp2'), :) / b.Values(strcmp(b.Condition, 'Con2'), :) * mean(b.Constant);

aT = table(transpose({aexp1, aexp2}),...
           transpose({'Exp1', 'Exp2'}),...
           transpose({'A', 'A'}),...
           transpose({2, 2,}),...
           'VariableNames', {'Values', 'Condition', 'Group', 'Constant'});

bT = table(transpose({bexp1, bexp2}),...
           transpose({'Exp1', 'Exp2'}),...
           transpose({'B', 'B'}),...
           transpose({2, 2,}),...
           'VariableNames', {'Values', 'Condition', 'Group', 'Constant'});

rTable = [aT; bT]

感谢您的任何意见或建议。也许,我正在处理的数据结构组织得很差。

4

1 回答 1

1

这是一个解决方案:

rTable = table();
myTable = table((1:8)',{'Con1', 'Con2', 'Exp1', 'Exp2','Con1', 'Con2', 'Exp1', 'Exp2'}',...
    {'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'}','VariableNames', {'Values' , 'Condition', 'Group', 'Constant'})





conditionrows = contains(myTable.Condition,'Con')
exprows = contains(myTable.Condition,'Exp')
conditionTable = myTable(conditionrows,:)
expTable = myTable(exprows,:)

constant = 2
rValues = expTable.Values./conditionTable.Values * constant

rTable = expTable
rTable.Values = rValues

由于您试图获得一个仅包含 exprows 的表,因此您将原始表分为一个 conditionTable 和一个 expTable。我假设每个 exp 行都有一个条件行,并且您在表中有很好的对应关系(如果没有,则需要更多处理),那么您可以简单地使用单行表达式计算 rValue。./ 是按元素划分的。另请注意,您可以使用 ' 在 matlab 中执行转置(进一步注意,例如,如果您想要 1:10 的列向量,您必须执行 (1:10)',1:10' 会为您提供来自 1 的行向量到 10,因为 1:10' 被解释为从 1 到 10 的转置的向量。

于 2017-12-28T11:31:40.353 回答