EXCEL 数组和维数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXCEL 数组和维数相关的知识,希望对你有一定的参考价值。

在函数中什么叫数组,什么叫维数
另请教AND的用法,越详细越好,最好可举例说明。

数组就是多个元素组成的系列数,如1、2、3、4、5……;A1、A2、A3、A4……等等。

维数相当于坐标轴,有几根坐标轴就叫几维。
如A1:A5区域的单元格的值就是一个一维数组,即只有一行或一列时可看作一维数组。一维数组相当于一根直线上的不同点。

如A1:D5可看作是二维数组。共有五行四列。相当于一个平面里有X轴和Y轴。通过两个维的位置可以确定第几行第几列。

三维数组相当于立体空间的三根坐标轴(XYZ)由三个值确定其空间的相对位置。这种情况在数组公式中用得较少。如表1--表4共四个工作表的A1:D5区域,就构成了一个三维数组。

数组公式需要用CTRL+SHIFT+回车三键结束,其公式两端会自动加上一对花括号。

有时在普通公式里面也会用来标明数组,各元素之间用半角逗号分隔。

AND是逻辑“与”函数,函数里面可以带多个参数,当所有参数(逻辑表达式)的值均为真时,AND函数的结果为逻辑真(TRUE),当任一参数的值为假时,AND函数得到逻辑假(FLASE)。
比如:
=AND(A1>50,A1<100,INT(A1)=A1)
这里有3个参数(逻辑表达式),只有A1为51至99之间的整数时,这个函数才得到真,其他情况均得到假.
参考技术A 你怎么那么250呀,AND就是并且的意思呀,就是有几个条件如果都是真值时,传回的结果为真,如果里面只要有一个条件的值为假时,则传回的结果为”假“

如何在运行时指定数组的一个和维数?

【中文标题】如何在运行时指定数组的一个和维数?【英文标题】:How Does One Sum Dimensions of an Array Specified at Run-Time? 【发布时间】:2010-09-06 14:17:57 【问题描述】:

我正在研究建立分布熵的函数。它使用 copula,如果有熟悉的话。我需要根据“关心”的维度来总结数组中的值。

示例:考虑以下示例...

维度 0(横向) _ _ _ _ _ _ _ _ _ _ _ _ _ |_ 0 _|_ 0 _|_ 0 _|_ 2 _|维度 1 |_ 1 _|_ 0 _|_ 2 _|_ 0 _| (下) |_ 0 _|_ 3 _|_ 0 _|_ 6 _| |_ 0 _|_ 0 _|_ 0 _|_ 0 _| 我只“关心”维度 0,而“不关心”其余维度(维度 1)。 将此数组与上述规格相加将 将维度 1 的“堆栈”“折叠”为单个 4 x 1 数组: _ _ _ _ _ _ _ _ _ _ _ _ _ |_ 1 _|_ 3 _|_ 2 _|_ 8 _| 然后可以将其相加,或执行任何操作。

我需要使用包含“n”个维度的数组来执行此操作,这可能是 20。此外,我需要能够做到这一点,关注某些维度并折叠其余维度。我对此特别困难,因为我无法想象 20 个维度:p。如果有人可以帮助我设置一些 c/c++ 代码来折叠/求和,我将非常感激。

更新:

刚到家。这里有一些信息可以回答您的问题:

    抱歉回滚编辑,我希望当我单击回滚时它会显示更改,这样我就可以看到我搞砸了,有点像***。我发现情况并非如此。 @jeff - 什么没有意义?我使用这项出色的服务是出于(我认为是)合法的原因。我想在我的爱好上做得更好,就像我在高中一样。我的许多帖子都与实现遗传算法有关(这篇文章,sparsearray,排列数组,指针操作)。 我正在使用稀疏数组表示,因为使用传统(密集)数组可能会超过宇宙中的分子数量。目前,sparsearray 本身的实现并不重要,因为我正在努力使其与标准数组一起工作,然后再进行稀疏表示。对于那些还没有看过我之前的问题的人,我使用二叉搜索树作为包含稀疏数组点的结构,并使用“驱动程序”函数在必要时遍历树,返回该函数的设计用途。这很灵活,因此我可以适应许多不同的访问数组的方法。 结构是一个超立方体,维数是在运行时指定的,以及每个维的长度(都是一样的,因为它是一个超立方体)。

感谢大家的投入。

【问题讨论】:

Ed,我正在查看your post history,想知道您是否想在 Stack Overflow 上拉个长篇大论。 你的任何问题都有意义吗? 【参考方案1】:

当你说你不知道有多少维度时,你到底是如何定义数据结构的?

在某些时候,有人需要创建这个数组,为此,他们需要知道数组的维度。您可以强制创建者将此数据与数组一起传递。

除非问题是定义这样的数据结构...

【讨论】:

【参考方案2】:

这可能有应用程序。假设您实现了一个 2D Conway 的生命游戏(它定义了一个 2D 平面,1 表示“活着”,0 表示“死”)并且您存储了每次迭代的游戏历史记录(然后定义了一个 3D 立方体)。如果你想知道历史上有多少细菌活着,你会使用上面的算法。您可以对 3D(以及 4D、5D 等)版本的 Game of Life 网格使用相同的算法。

我会说这是一个递归问题,我还不是 C 程序员,但我知道在 C 中是可能的。在 python 中,


def iter_arr(array):
  sum = 0
  for i in array:
    if type(i) == type(list()):
      sum = sum + iter_arr(i)
    else:
      sum = sum + i
  return sum 
    遍历数组中的每个元素 如果元素是另一个数组,则再次调用该函数 如果元素不是数组,则将其添加到总和中 返回总和

然后,您可以将其应用于“关心”维度中的每个元素。

这在 python 中更容易,因为鸭子类型虽然 ...

【讨论】:

【参考方案3】:

如果你使用 STL 容器,或者Boost.MultiArray,这种事情会容易得多。但是如果你必须使用数组:

#include <iostream>
#include <boost/foreach.hpp>
#include <vector>

int sum(int x) 
    return x;


template <class T, unsigned N>
int sum(const T (&x)[N]) 
    int r = 0;
    for(int i = 0; i < N; ++i) 
        r += sum(x[i]);
    
    return r;


template <class T, unsigned N>
std::vector<int> reduce(const T (&x)[N]) 
    std::vector<int> result;
    for(int i = 0; i < N; ++i) 
        result.push_back(sum(x[i]));
    
    return result;


int main() 
    int x[][2][2] = 
          1, 2 ,  3, 4  ,
          5, 6 ,  7, 8  
    ;

    BOOST_FOREACH(int v, reduce(x)) 
        std::cout<<v<<"\n";
    

【讨论】:

【参考方案4】:

@杰夫

我实际上认为这是一个有趣的问题。我不确定它有多大用处,但这是一个有效的问题。

@Ed

你能提供更多关于这个问题的信息吗?你说数组的维度是动态的,但元素的数量也是动态的吗?

编辑:无论如何我都会尝试回答这个问题。我无法在脑海中为您提供代码(在这台 PC 上没有任何编译器的情况下需要一段时间才能正确完成),但我可以为您指明正确的方向...

让我们以索引 0 到 3 的 8 维 (0-7) 为例。您只关心 1,2 和 6。这意味着您有两个数组。首先,array_care[4][4][4] 表示 1,2 和 6。array_care[4][4][4] 将保存最终结果。

接下来,我们想以一种非常具体的方式进行迭代。我们有要解析的数组input[4][4][4][4][4][4][4][4],我们关心维度 1、2 和 6。

我们需要定义一些临时索引:

int dim[8] = 0,0,0,0,0,0,0,0;

我们还需要存储我们想要增加索引的顺序:

int increase_index_order[8] = 7,5,4,3,0,6,2,1;
int i = 0;

此命令对于执行您的请求很重要。

定义一个终止标志:

bool terminate=false;

现在我们可以创建循环了:

while (terminate)

array_care[dim[1]][dim[2]][dim[6]] += input[dim[0]][dim[1]][dim[2]][dim[3]][dim[4]][dim[5]][dim[6]][dim[7]];

while ((dim[increase_index_order[i]] = 3) && (i < 8))

dim[increase_index_order[i]]=0;
i++;


if (i < 8) 
dim[increase_index_order[i]]++; i=0;
 else 
terminate=true;


这应该适用于 8 个维度,关心 3 个维度。让它变得动态需要更多时间,而我没有时间。希望这可以帮助。我很抱歉,但我还没有学习代码标记。 :(

【讨论】:

【参考方案5】:

如果我理解正确,您希望将每个“bin”沿一维定义的横截面中的所有值相加。我建议为您的目标创建一个一维数组,然后循环遍历数组中的每个元素,将值添加到目标,并使用感兴趣的维度的索引。

如果您使用任意数量的维度,则必须有一种寻址元素的方法(我很好奇您是如何实现的)。您对此的实施将影响您设置目标索引的方式。但一个明显的方法是在迭代循环中检查 if 语句。

【讨论】:

【参考方案6】:
x = number_of_dimensions;
while (x > 1)

  switch (x)
  
    case 20:
      reduce20DimensionArray();
      x--;
    break;
    case 19:
      .....
  

(对不起,忍不住了。)

【讨论】:

【参考方案7】:

您在 c/c++ 中执行此操作...所以您有一个数组数组...您不必可视化 20 维,因为这不是数据在内存中的布局方式,对于二维:

[1] --> [1,2,3,4,5,6,...]
[2] --> [1,2,3,4,5,6,...]
[3] --> [1,2,3,4,5,6,...]
[4] --> [1,2,3,4,5,6,...]
[5] --> [1,2,3,4,5,6,...]
 .           .
 .           .
 .           .

那么,为什么你不能遍历第一个总结它的内容?如果您正在尝试查找大小,那么sizeof(array)/sizeof(int) 是一种冒险的方法。您必须知道能够处理此数据的维度,并设置内存,因此您知道要求和的递归深度。这是你应该做的一些伪代码,

sum( n_matrix, depth )
  running_total = 0
  if depth = 0 then
    foreach element in the array
      running_total += elm
  else 
     foreach element in the array
       running_total += sum( elm , depth-1 )
  return running_total

【讨论】:

【参考方案8】:

我不敢苟同,总有另一种方式..

如果你真的不能重构,那么你需要把问题分解成更小的部分。就像我说的,确定你需要对哪些维度求和,然后一次处理一个。 .

另外,停止更改编辑,他们正在纠正您的拼写错误,他们正在努力帮助您;)

【讨论】:

【参考方案9】:

我认为最好的做法是两件事之一/两者:

    重新考虑设计,如果太复杂,请找到不太复杂的方法。 停止尝试将其可视化.. :P 只需存储需要求和的相关维度,然后一次执行一个。获得基本代码后,再考虑提高算法的效率。

【讨论】:

【参考方案10】:

实际上,通过折叠您已经对它们求和的列,因此对于您的示例而言,维度根本不重要。我错过了什么还是你错过了什么?

【讨论】:

以上是关于EXCEL 数组和维数的主要内容,如果未能解决你的问题,请参考以下文章

对浮点数数组进行排序[重复]

如何在浮点数数组中创建一个由 1 组成的圆圈

浮点数数组的音高检测

c语言输入6个整数,存入整数数组int num【6】 求该数数组中所以整数的总和

如何在运行时指定数组的一个和维数?

excel 里出现 #value? 如何解决呢?