-
一维数组、二维数组、三维数组、四维数组、多维数组的理解
2020-06-22 00:43:41一维数组是一条线 二维数组是一页纸 三维数组是一本书 四维数组是书架 五维数组是图书室2201(好几个书架) 六维数组是图书馆某一层,2楼/3楼,好几个图书室 七维数组是整个图书馆 第N维数组是...以图书馆来举例
一维数组是一条线
二维数组是一页纸
三维数组是一本书
四维数组是书架
五维数组是图书室2201(好几个书架)
六维数组是图书馆某一层,2楼/3楼,好几个图书室
七维数组是整个图书馆
第N维数组是宇宙.........................
-
Matlab绘图(三)散点图—四维数据、五维数据、六维数据、七维数据散点图可视化绘制
2021-02-02 15:51:16Matlab绘图(三)散点图—四维数据、五维数据、六维数据、七维数据可视化分析一、前言二、散点图特征分析三、六维数据可视化示例散点图 一、前言 这将是个有趣的帖子,上次我写到了关于变色散点图的二维、三维绘制...Matlab绘图(三)散点图—四维数据、五维数据、六维数据、七维数据可视化分析
一、前言
- 这将是个有趣的帖子,上次我写到了关于变色散点图的二维、三维绘制。在二维散点图绘制中,颜色变化映射的数据是y值;三维绘制中,颜色的变化映射的数据是z值。
- 正常来说,我们碰到的绘图数据大多数情况是二、三维的。但是四、五、六、七维度的情况还是存在的,我最近做项目的时候遇到了六维度数据可视化的问题,在查找相关资料的时候受到 【Matlab】散点图之五维数据可视化和matlab的四维图像数据可视化 两位博主优秀帖子的启发,顺利完成了六维度数据的可视化。同时,对于四维、五维、六维、七维数据在散点图上的可视化方案自己也做出了一些思考,特此记录。
二、散点图特征分析
(1)原理分析:
-
对于二维散点图来说,可以利用的特征有:x值 、y值、散点的大小、散点的填充颜色、散点的线框颜色、散点的形状。六大特征,这就意味着对于二维散点图可以进行二到六维数据的可视化操作。
-
对于三维散点图来说,可以利用的特征有:x值 、y值 、z值、散点的大小、散点的填充颜色、散点的线框颜色、散点的形状。七大特征,这就意味着对于三维散点图可以进行三到七维数据的可视化操作。
基于上述分析,利用散点图实现对四维、五维、六维甚至七维数据的可视化是可行的方案,具体需要根据自己的数据情况来进行方案选择。
(2)方案分析:
四维数据进行可视化方案
大体可以有两种方案:
- 采用二维散点图。除了x值、y值以外,在散点的大小、散点的填充颜色、散点的线框颜色、散点的形状四个特征中任选其二。选择时应该考虑你的数据量大小。
- 采用三维散点图。除了x值 、y值、z值以外,在散点的大小、散点的填充颜色、散点的线框颜色、散点的形状四个特征中任选其一。同样,选择时应该考虑你的数据量大小。
五维数据进行可视化方案
大体也可以有两种方案:
- 采用二维散点图。除了x值、y值以外,在散点的大小、散点的填充颜色、散点的线框颜色、散点的形状四个特征中任选其三。选择时应该考虑你的数据量大小。
- 采用三维散点图。除了x值 、y值、z值以外,在散点的大小、散点的填充颜色、散点的线框颜色、散点的形状四个特征中任选其二。同样,选择时应该考虑你的数据量大小。
六维数据进行可视化方案
思路同上,在下面我会以六维数据的散点图可视化为例做出示意。
七维数据进行可视化方案
需要注意的是七维数据的表达就只能采用三维散点图加上其余四项特征了。
三、散点图之六维数据可视化示例
本方案采用三维散点图+散点的大小、散点的填充颜色、散点的线框颜色六个特征对数据进行可视化操作,并且方案实施分为三步:
step1、三维数据进行可视化
- 在变色散点图的二维、三维绘制中,我写到了利用scatter3函数进行三维散点图的基本绘制,将六维中的三维数据可视化出来。
clc; clear; A=magic(6); x=A(:,1); y=A(:,2); z=A(:,3); scatter3(x,y,z);
step2、五维数据进行可视化
- 利用scatter中控制散点大小的sz和颜色分布的c 映射另外两维数据,并添加对应的图例。
%scatter(x,y,sz,c) c控制颜色,其颜色可直接赋值 r、 g 、k、 b等,也可以用矩阵来设置对应x、y点对应圆圈的颜色分布
clc; clear; A=magic(6) x=A(:,1); y=A(:,2); z=A(:,3); s=A(:,4)*15;%映射大小 c=A(:,5);%映射填充颜色 f=A(:,6);%映射线框颜色 figure; %生成控制散点大小的数值 s1=floor(s); sizes = unique(s1); %生成颜色 clos = unique(c); cc = parula(length(clos)); cc = fliplr(cc')'; for i=1:length(clos) ind = find(c== clos(i)); scatter3(x(ind),y(ind),z(ind),s(ind),cc(i,:),'fill'); legendtext{i} = num2str(clos(i)); legendtext1{i+1} = num2str(sizes(i)); hold on; end legend(legendtext);
可以看到,现在图中已经对应了五维数据的可视化,但是散点图大小的图例没有显示出来,这里从【Matlab】散点图之五维数据可视化博主优秀的帖子中,可以获得 legendScatter(TextCell,SizeDim,Factor,LinSpec)函数,用来显示大小图例。function [hleg,hobj]=legendScatter(TextCell,SizeDim,Factor,LinSpec) %% LEGENDSCATTER: workaround for R2016a and later for scatter plot legend. % This function aims to simplify the creation of a legend for scatter plots. % The function will plot a legend on current axis with the right % markersize proportion. % NB. From version 1.0.5 is added the compatibility with previous MATLAB % version. % % Inputs: - TextCell: a cell array containing the legend-entry text. % WARNING: THE FIRST CELL IS THE TITLE !!! % - SizeDim: the ''MarkerSize'' dimension for each entry. % WARNING: length(SizeDim)==length(TextCell)-1 !!! % - Factor: normaling factor for enlarge the marker size in % a linear way. (MarkerSize*sqrt(Factor) % - LinSpec: specify the marker-string. % % EXAMPLE: ----------------------------------------------------- % Factor=1.5; % A=[1,1,1; % 2,2,2; % 3,3,3; % 4,4,4; % 5,5,5; % 6,6,6; % 7,7,7; % 8,8,8; % 9,9,9; % 10,10,10]; % % sh=scatter(A(:,1),A(:,2),(A(:,3).^2)*Factor,'ok'); % %scattersize==MarkerSize*sqrt(Factor)pt) % leg=LEGENDSCATTER({'SIZE','1','2','3','4','5', ... % '6','7','8','9','10'},[1:1:10],Factor,'ok'); % leg.Location='NorthWest'; axis([0,11,0,11]) % ----------------------------------------------------- % % VERSION:1.0.5 % AUTHOR: Matteo Bagagli - ETH-Zurich // Oct. 2016 % MAIL: matteo.bagagli@erdw.ethz.ch %% FAKE PLOTS hold on hplt=zeros(length(TextCell),1)'; for ii=1:length(TextCell) hplt(ii)=plot(NaN,NaN,LinSpec); end hold off %% WORK [hleg,hobj]=legend(hplt,TextCell,'Units','points'); drawnow % To update the figure and the legend idx=(length(TextCell)+4):2:length(hobj); % Skip text and TITLE MARKER %idx=(1:1:length(TextCell)); v=version; if str2double(v(1)) >= 9 % MATLAB v9.0 and higher % Title hobj(1).FontWeight='bold'; ActPos=hobj(1).Position; hobj(1).Position=[0.5,ActPos(2),ActPos(3)]; hobj(1).HorizontalAlignment='center'; hobj(1).FontSize=11; hobj(length(TextCell)+2).Marker='none'; % Body for ii=1:length(idx) hobj(idx(ii)).MarkerSize=SizeDim(ii)*sqrt(Factor); end else % MATLAB v8 and lower % Title set(hobj(1),'FontWeight','bold'); ActPos=get(hobj(1),'Position'); set(hobj(1),'Position',[5,ActPos(2),ActPos(3)]); set(hobj(1),'HorizontalAlignment','center'); set(hobj(1),'FontSize',11); set(hobj(length(TextCell)+2),'Marker','none'); % Body for ii=1:length(idx) set(hobj(idx(ii)),'MarkerSize',SizeDim(ii)*sqrt(Factor)); end end % end switch version end % EndMain
利用legendScatter(TextCell,SizeDim,Factor,LinSpec) 函数,我们可以得到:
clc; clear; A=magic(6) x=A(:,1); y=A(:,2); z=A(:,3); s=A(:,4)*15;%映射大小 c=A(:,5);%映射填充颜色 f=A(:,6);%映射线框颜色 figure; %生成控制散点大小的数值 s1=floor(s); sizes = unique(s1); %生成颜色 clos = unique(c); cc = parula(length(clos)); cc = fliplr(cc')'; legendtext1{1}='大小'; for i=1:length(clos) ind = find(c== clos(i)); scatter3(x(ind),y(ind),z(ind),s(ind),cc(i,:),'fill'); legendtext{i} = num2str(clos(i)); legendtext1{i+1} = num2str(sizes(i)/15); hold on; end legend(legendtext); hold on; Factor=1; axes('position',get(gca,'position'),'visible','off'); legendScatter(legendtext1,sizes/15,Factor,'ok');
需要注意的是,生成第二的图例之前要加入下面的一行语句,防止上一个图例被覆盖。axes('position',get(gca,'position'),'visible','off');
step3、六维数据进行可视化
- 利用散点图的线框颜色映射第六维度数据,调用颜色栏:
%绘制线框颜色 scatter3(x,y,z,s,c,'linewidth',2) colormap(cool); colorbar; legend(legendtext);
完整代码
clc; clear; A=magic(6) x=A(:,1); y=A(:,2); z=A(:,3); s=A(:,4)*15;%映射大小 c=A(:,5);%映射填充颜色 f=A(:,6);%映射线框颜色 figure; %生成控制散点大小的数值 s1=floor(s); sizes = unique(s1); %生成颜色 clos = unique(c); cc = parula(length(clos)); cc = fliplr(cc')'; legendtext1{1}='大小'; for i=1:length(clos) ind = find(c== clos(i)); scatter3(x(ind),y(ind),z(ind),s(ind),cc(i,:),'fill'); legendtext{i} = num2str(clos(i)); legendtext1{i+1} = num2str(sizes(i)/15); hold on; end hold on; %绘制线框颜色 scatter3(x,y,z,s,c,'linewidth',2) title('六维图'); xlabel('第一维');% x轴名称、字体及大小 ylabel('第二维');% y轴名称、字体及大小 zlabel('第三维');% z轴名称、字体及大小 colormap(cool); colorbar; legend(legendtext); Factor=1; axes('position',get(gca,'position'),'visible','off'); legendScatter(legendtext1,sizes/15,Factor,'ok');
运行结果如下,为了美观需要对图例进行一些位置的调整。
四、思考
以上就是我自己关于4-7维数据在散点图上的一些可视化原理和分析方案。
- 但是在这里呢,我还想说的就是绘图之前,我们需要仔细思考思考,有没有必要非要在一张图上绘制4-7维度?因为我觉得绘制出来的图只能作为一种示意功能,有可能会造成花里胡哨的感觉(当然这和审美有关系)
- 例如,4维数据可以选择确定某一维数的情况下绘制多张三维图来表达数据的趋势关系,当然这个只是个人的一些思考和建议,具体问题还需要具体分析。
五、参考博客
最后,感谢两位博主的分享:
☀ 记录自己学习的同时,也希望能对大家有所帮助,欢迎留言交流!
-
ARM_C高级(一)(一重、二重)指针、(一维、二维)数组以及typedef的用法
2020-03-23 17:51:35文章目录(一)数组指针、指针数组(二)函数指针(三)typedef的用法(四)二重指针(五)二维数组(六)二维数组与指针的关系 (一)数组指针、指针数组 指针数组 实质是一个数组,这个数组中存储的内容全部...(一)数组指针、指针数组
-
指针数组 实质是一个数组,这个数组中存储的内容全部是指针变量。 数组指针 实质是一个指针,这个指针指向的是一个数组。 -
int *p[5]; 指针数组 int *p[5]; 核心是p,p是一个数组,数组有5个元素大,数组中的元素都是指针,指针指向的元素类型是int类型的;整个符号是一个指针数组。 int (*p)[5]; 数组指针 核心是p,p是一个指针,指针指向一个数组,数组有5个元素,数组中存的元素是int类型; 总结一下整个符号的意义就是数组指针。 int *(p[5]); 指针数组 解析方法和结论和第一个相同,()在这里是可有可无的。 - 注意:
- 符号的优先级到底有什么用?
- 其实是决定当2个符号一起作用的时候决定哪个符号先运算,哪个符号后运算。
- 遇到优先级问题怎么办?
- 第一,查优先级表;第二,自己记住(只要记住[] . ->这几个优先级比较好即可)。
- 符号的优先级到底有什么用?
- 注意:
(二)函数指针
- 函数指针的实质(还是指针变量)
- (1)函数指针的实质还是指针,还是指针变量。本身占4字节(在32位系统中,所有的指针都是4字节)
- (2)函数指针、数组指针、普通指针之间并没有本质区别,区别在于指针指向的东西是个什么玩意。
- (3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示。
- (4)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址(也就是它的函数名这个符号在编译器中对应的值)
- 函数指针的书写
- 假设我们有个函数是:void func(void); 对应的函数指针:
void (*p)(void);
类型是:void (*)(void);
- 假设我们有个函数是:void func(void); 对应的函数指针:
- 函数名与数组名的区别
- 函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的;但是数组名做右值时加不加&意义就不一样。
-
#include <stdio.h> void func(void); typedef void (*pFunc)(void); int main(void) { int a[3] = {0}; int *p = NULL; int (*p3)[3] = NULL; //数组名做右值时,不加&代表数组首元素的地址(a和&a[0]等同) //而加&时,&a代表整个数组整体的地址,类型为 int (*)[3] p = a; //p = &a; p3 = &a; //函数名做右值时,加不加&都是一样的 pFunc p1 = func; pFunc p2 = &func; return 0; } void func(void) { }
-
- 函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的;但是数组名做右值时加不加&意义就不一样。
- 一个复杂的实例:
- 譬如函数是strcpy函数
char *strcpy(char *dest, const char *src);
,对应的函数指针是:char *(*pFunc)(char *dest, const char *src);
- 譬如函数是strcpy函数
(三)typedef的用法
- typedef是C语言中一个关键字,作用是用来定义(或者叫重命名类型)
- C语言中的类型一共有2种:
-
类型ADT(编译器定义的原生类型) 基础数据类型,如int、double之类的 义类型UDT(用户自定义类型) 不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····)
-
- 注意:typedef是给类型重命名,也就是说typedef加工出来的都是类型,而不是变量。
- (1)类型是一个数据模板,变量是一个实在的数据。类型是不占内存的,而变量是占内存的。
- (2)面向对象的语言中:类型就是类class,变量就是对象。
- typedef与#define宏的区别
-
typedef char *pChar; #define pChar char *
-
- typedef与结构体
- 结构体在使用时都是先定义结构体类型,再用结构体类型去定义变量。
- C语言语法规定,结构体类型使用时必须是struct 结构体类型名 结构体变量名;这样的方式来定义变量。
- 使用typedef一次定义2个类型,分别是结构体变量类型,和结构体变量指针类型。
-
#include <stdio.h> struct student { char name[20]; int age; }; //使用typedef定义了新的数据类型,此时可以使用struct teacher、teacher_t定义变量 //可以使用pTeacher_t定义结构体指针变量 typedef struct teacher { char name[20]; int age; char course; }teacher_t, *pTeacher_t; int main(void) { struct student stu; struct teacher t; teacher_t t1; t1.age = 20; pTeacher_t p1 = &t1; printf("teacher's age is %d.\n", p1->age); return 0; }
- typedef与const
- typedef int *PINT; const PINT p2; 相当于是int *const p2;
- typedef int *PINT; PINT const p2; 相当于是int *const p2;
- 如果确实想得到const int *p;这种效果,只能typedef const int *CPINT; CPINT p1;
-
#include <stdio.h> typedef int *PINT; typedef const int *PINT_t; int main (void) { int a = 5; int b = 5; const PINT p1 = &b; //无论const 放在哪里,p1的值都是不可改变的 PINT const p2 = &b; // *p1的值是可以改变的 printf("0x%x\n", p2); //p1 = &a; //error: assignment of read-only variable ‘p1’ //p2 = &a; //error: assignment of read-only variable ‘p2’ *p1 = a; *p2 = a; PINT_t p3 = NULL; //同上面相反 *p3 = a; //error: assignment of read-only location ‘*p3’ p3 = &b; printf("0x%x\n", p3); p3 = &a; printf("0x%x\n", p3); return 0; }
- 使用typedef的重要意义(2个:简化类型、创造平台无关类型)
- 简化类型的描述。char ()(char *, char *); typedef char *(*pFunc)(char *, char *);
- 很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器上是16位的,在32位机器上就是32位的)。为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术.
内核中先定义:typedef int size_t; 然后在特定的编码需要下用size_t来替代int(譬如可能还有typedef int len_t) - STM32的库中全部使用了自定义类型,譬如typedef volatile unsigned int vu32;
(四)二重指针
- 本质上来说,二重指针和一重指针的本质都是指针变量,指针变量的本质就是变量。一重指针变量和二重指针变量本身都占4字节内存空间。
- 二重指针本质上也是指针变量,和普通指针的差别就是它指向的变量类型必须是个一重指针。
- 二重指针的用法
- 二重指针指向一重指针的地址
- 二重指针指向指针数组的(二重指针就是:指针数组指针)
#include <stdio.h> int main(void) { int *p; int **p1; int a = 5; p = &a; p1 = &p; int *b[5] = {0}; p1 = b; //数组名作右值时,代表数组首元素的地址,指针数组中的元素类型为 int * //所以b的类型就是 int **,和p1二重指针是匹配的。 return 0; }
- 实践编程中二重指针用的比较少,大部分时候就是和指针数组纠结起来用的。
- 实践编程中有时在函数传参时为了通过函数内部改变外部的一个指针变量,会传这个指针变量的地址(也就是二重指针)进去
(五)二维数组
- (1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。
- (2)二维数组int a[2][4]和一维数组int a[8]其实没有任何本质差别。我们可以把两者的同一单元的对应关系写下来。
a[0] a[1] ··· a[3] a[4] ··· a[8] a[0][0] a[0][1] ··· a[0][3] a[1][0] ··· a[1][3] - 哪个是第一维哪个是第二维?
- (1)二维数组int a[2][4]中,2是第一维,4是第二维。
- (2)结合内存映像来理解二维数组的第一维和第二维的意义。首先第一维是最外面一层的数组,所以int a[2][4]这个数组有2个元素;其中每一个元素又是一个含有4个元素的一维数组(这个数组就是第二维)。
- (3)总结:二维数组的第一维是最外部的那一层,第一维本身是个数组,这个数组中存储的元素也是个一维数组;二维数组的第二维是里面的那一层,第二维本身是个一维数组,数组中存的元素是普通元素,第二维这个一维数组本身作为元素存储在第一维的二维数组中。
- 二维数组的下标式访问和指针式访问
- (1)回顾:一维数组的两种访问方式。以int b[10]为例, int *p = b;。
b[0] 等同于 *(p+0); b[9] 等同于 *(p+9); b[i] 等同于 *(p+i) - (2)二维数组的两种访问方式:以int a[2][5]为例,(合适类型的)p = a;
a[0][0]等同于*(*(p+0)+0); a[i][j]等同于*(*(p+i)+j)
- (1)回顾:一维数组的两种访问方式。以int b[10]为例, int *p = b;。
- 二维数组的应用和更多维数组
- (1)最简单情况,有10个学生成绩要统计;如果这10个学生没有差别的一组,就用b[10];如果这10个学生天然就分为2组,每组5个,就适合用int a[2][5]来管理。
- (2)最常用情况:一维数组用来表示直线,二维数组用来描述平面。数学上,用平面直角坐标系来比拟二维数组就很好理解了。
- (3)三维数组和三维坐标系来比拟理解。三维数组其实就是立体空间。
- (4)四维数组也是可以存在的,但是数学上有意义,现在空间中没有对应(因为人类生存的宇宙是三维的)。
总结:一般常用最多就到二维数组,三维数组除了做一些特殊与数学运算有关的之外基本用不到。(四轴飞行器中运算飞行器角度、姿态时就要用到三维数组)
(六)二维数组与指针的关系
- 指针指向二维数组的数组名
- (1)二维数组的数组名表示二维数组的第一维数组中首元素(也就是第二维的数组)的首地址
- (2)二维数组的数组名a等同于&a[0],这个和一维数组的符号含义是相符的。
- (3)用数组指针来指向二维数组的数组名是类型匹配的。
-
#include <stdio.h> int main(void) { int a[2][4] = {{1, 2, 3, 4},{5, 6, 7, 8}}; printf("a[1][2] = %d\n", a[1][2]); printf("a[1][2] = %d\n", *(*(a + 1) + 2)); int (*p)[4]; //数组指针,指向一个数组,数组有4个int 类型元素; p = a; //二维数组名作右值,代表二维数组的第一维的数组的首元素地址 //因此,a等同于&a[0] p = &a[0]; printf("a[1][3] = %d\n", *(*(p+1)+3)); return 0; }
- 指针指向二维数组的第一维
- (1)用int *p来指向二维数组的第一维a[i]
-
#include <stdio.h> int main(void) { int a[2][4] = {{1, 2, 3, 4},{5, 6, 7, 8}}; int *p1; p1 = a[0]; p1 = &a[0][0]; //a[0]表示二维数组的第一维的第一个元素, //相当于第二维数组的数组名, //又因为数组名就是首元素地址,所以,a[0]等同于&a[0][0] printf("a[0][1] = %d\n", *(p1 + 1)); int *p2; p2 = a[1]; printf("a[1][1] = %d\n", *(p2 + 1)); return 0; }
- 指针指向二维数组的第二维
- (1)二维数组的第二维元素其实就是普通变量了(a[1][1]其实就是int类型的7),已经不能用指针类型和它相互赋值了。
- (2)除非int *p = &a[i][j];,类似于指针指向二维数组的第一维
-
-
【DBMS 数据库管理系统】OLAP 核心技术 : 多维数据模型 ( 多维数据模型 | 维 | 维成员 | 维层 | 维层次 | ...
2020-08-10 20:26:05一、OLAP 核心技术、 二、OLAP 多维数据模型、 三、OLAP 多维数据模型 核心概念、 四、维、 五、维成员、 六、维层、 七、维层次、 八、维属性、 九、度量
一、OLAP 核心技术
OLAP 核心技术 :
- 多维数据模型
- 多维分析操作
- 多维查询及展示
- 数据方体技术
二、OLAP 多维数据模型
"用户数据视图" 概念 : 在数据分析时 , 用于面向分析的数据模型 , 用于为分析人员提供 多种观察数据的视角 , 和 面向分析的操作 ;
"多维数据模型" 作用 : 多维数据模型 是 数据仓库 和 OLAP 联机分析处理 的 基础 ;
"多维数据模型" 表示 :
- 多维数组 : 多维数据模型 的 数据结构 , 可以使用 多维数组 表示 ;
- 实例 : 维度 , 维度 , , 维度 , 维度之间的交叉点 , 存放度量值 , 每个度量值由若干数据组成 ; 如 二维数据 , 维度 是 轴 , 维度 数据是 轴 , 每个 都可以定位一个度量值 ;
"多维数据模型" 本质 : 多维数据模型 本质是 多维空间 , “维” 表示用户观察的对象 , 观察角度 , 多维空间中的 “点” 表示 度量 的值 ; OLAP 采用 “多维数据模型” ;
"多维数据模型" 与 传统的关系数据模型不同 :
- OLTP 关系数据模型 : 传统关系数据模型是二维的 , 关系数据库有一套 “关系-代数理论” , 有非常深厚的数学基础 ;
- OLAP 多维数据模型 : 多维数据模型是 随着 OLAP 产品的流行出现 , 缺乏理论基础 , 目前没有统一的多维数据模型 ;
"多维数据模型" 不同表示方式 :
- 使用 “关系模型” 表示 多维数据模型 ;
- 将 多维数据模型 形式化为 “多维空间” ;
三、OLAP 多维数据模型 核心概念
OLAP 多维数据模型 核心概念 :
- 维
- 维成员
- 维层
- 维层次
- 度量
四、维
"维" 简介 :
- "维" 概念 : 人们 观察数据的 特定角度 , 事物的属性 ;
- "维" 作用 : “维” 是商业活动的 基本要素 , 每个 “维” 有唯一的名称 , 如 时间维 , 地区维 等 ;
"维" 示例 : 分析 商品销售 数据 , 涉及 商品的 时间 , 地区 , 就是维 ;
- 时间维 : 商品在不同的时间的销售情况 ;
- 地区维 : 商品在不同的地区的销售情况 ;
五、维成员
"维成员" 简介 :
- 维 与 “维成员” : 维 是由若干 “维成员” 组成 ; 维的 一个取值 称为 “维成员” , 每个 “维成员” 都有一个名字 , 可以有 若干属性 描述 “维成员” 特征 ;
- 多维层 “维成员” : 维 可能是 多层的 , 该 维 的 “维成员” 可以是 在不同 维层 上的取值组合 ;
"维成员" 示例 :
- "时间维" 示例 : 以 “时间维” 为例 , 时间维上有 个时间数据 , 每个时间数据都是一个 “维成员” ;
- 个维层次 : “时间维” 有 : 年 , 月 , 日 , 三个层次 ;
- 多维层 “维成员” : 每个时间数据 ( “维成员” ) 可以由 个维层的数据组成 , 如 年 月 日 , 分别是 年 , 月 , 日 , 三个维层 的数据 ;
- 单维层 “维成员” : 也可以只使用一个 维层 的数据 , 如 年 , 只有一个维层的数据 ;
- "维成员" 取值灵活 : “维成员” 取值 既可以使用 维 的全部维层数据 , 也可以只取一个维层的数据 , 也可以选择若干 维层 数据组合 ;
六、维层
"维层" 简介 :
-
"维层" 概念 : 观察数据时 , 除了从 某一角度 观察外 , 还需要 从 “不同细节程度” 去观察 , 这些 不同的细节程度 , 称为 “维层” ;
-
"维层" 示例 : 时间维 : 日 , 月 , 年 , 是时间维 的 维层 ; 地区维 : 街道 , 城市 , 省份 , 国家 , 是地区维的 维层 ;
-
"维层" 描述 : 维层 描述了 数据的 细节程度 , 抽象级别 , 每个维层都有一个名称 , 维层之间存在抽象级别决定关系 , 如上述地区维 , 国家下有很多省份 , 省份下有很多城市 , 城市下有很多街道 ;
-
"维层" 成员 : 每一个维层的具体取值 , 称为 维层成员 , 如 地区维 , 国家维层 , 有中国 , 美国 , 省份维层有 广东 , 浙江 ;
-
"维层" 本质 : 维层 本质上 是 对 维成员 的 组织分类方法 ;
七、维层次
"维层次" 简介 :
- "维层次" 概念 : 若干 维层 可以构成 分类方法 , 在 维 中 , 可以有多个分类方法 , 每种分类方法叫做 “维层次” ;
- "维层次" 示例 : 以 时间维 为例 , 按照 年 -> 季度 -> 月 -> 日 进行分类 , 这是一个维层次 , 也可以 按照 年 -> 月 -> 周 进行分类 , 这也是一个维层次 ; 上述是 时间维 的 两个维层次 ; 不同维层的组织方法 , 称为维层次 ;
八、维属性
"维属性" 简介 :
-
"维属性" 概念 : 维属性 用于 说明 维成员 具有的特征 ;
-
"维属性" 定义位置 : 维属性可以 定义在维成员上 , 也可以 定义在维层上 ; 如果将维属性 定义为维层上 , 那么该层次上的每个维成员都具有该属性 ;
-
"维属性" 定义示例 : 维成员 是 商店 , 为商店 定义 负责人 属性 , 可以直接在该 商店 维成员上定义 , 可以在 地区维 下定义该属性 , 如果在地区维 定义维属性 , 那么该地区所有的商店的负责人都是同一个人 ;
九、度量
"度量 " 简介 :
-
"度量" 概念 : 分析的 目标 或 对象 , 称为 度量 ;
-
"度量" 表示 : 度量一般有 名字 , 数据类型 , 单位 , 公式 等属性 ;
-
输入 “度量” : 从业务活动中获取的值 ; 如 销售额 ;
-
导出 “度量” : 经过计算得到的值 ; 如 利润 ;
-
聚集计算 : 求和 , 求平均值 等操作 ;
-
可累计型 “度量” : 可以沿 时间维 做聚集计算 , 称为 可累计型 的度量 , 如营业额 ;
-
不可累计型 “度量” : 不能沿 时间维 做聚集计算 , 称为 不可累计型 的度量 , 如库存 , 不能将不同时间的库存累加起来 ;
“度量” 是 多个 “维” 的 交叉点 ;
-
4.1、C++的一维数组、二维数组(月份转换器)
2019-08-27 10:53:10一维数组 二维数组 月份转换器 //月份转换器 #include<... char month[12][7] = { "一月","二月" ,"三月" ,"四月" ,"五月" ,";六月" ,"七月" ,"八月" ,"九月" ,"十月" ,"十一月","十... -
5.2二维数组
2020-06-22 18:27:12三、二维数组的初始化 完全初始化 不完全初始化 四、二维数组的引用 通过指针引用多维数组(见指针部分) 普通引用 五、二维数组的操作 输出二维数组 求二维数组最大的元素返回下标 求二维数组的鞍点(该行... -
数组知识点总结(一维数组、二维数组、Arrays工具类)
2020-09-24 20:08:32目录数组一、数组的概述二、一维数组的使用1、声明2、初始化3、引用4、默认初始化值5、操作数组时内存的状态5.1、初始化过程内存状态5.2、内存分析三、多维数组的使用1、概念2、初始化3、内存分析四、数组中涉及到的... -
C语言实现贪吃蛇(洗牌算法 && 循环数组 && 二维坐标与一维坐标的转化)
2018-07-27 16:22:393、二维坐标与一维坐标的转化: 三:准备过程(开始之前务必熟悉) 四:结构体的定义 五:主要函数的实现 1、移动蛇的函数: 2、随机产生食物函数: 3、边界,障碍物,食物,头撞到身体的判断 六:运行截图 ... -
投影与三维视觉
2016-12-08 14:54:08投影与三维视觉 一 投影 二 仿射变换和透视变换 2.1 POSIT:3D姿态估计 2.2 立体成像 三 三角测量 四 对极几何 五 本征矩阵和基础矩阵 5.1**极线的计算** 六 立体标定 七 立体校正 八 校正映射 九 立体匹配 ... -
三维数组
2009-12-16 11:23:00一维数组就象一行字。 二维数组就象一页字。 三维数组就象一本书。 四维数组就象一套书。 五维数组就象多套书组成的书柜。 六维数组就象多个书柜组成的图书馆。 七维的想不出来了,反正是多个图书馆的集合。 八,九... -
Matlab图形功能与图像绘制(重叠与多区绘图、二维、三维、等值线)
2019-07-09 14:12:00目录 想查找相关内容也可在页面按ctrl+F搜索文字 一、MATLAB的图形功能 二、瞄点连线绘图(plot) ...五、三位空间曲线绘制(plot3(x,y,z)) 六、网格点的坐标生成 / 曲面绘制 七、等值线绘制(contour/c... -
自学C day09-二维数组
2021-02-11 10:41:54打印数组 打印一维数组的话,用一个for循环 打印二维数组的话,用两个for循环 二级标题 三级标题 四级标题 五级标题 六级标题 -
国内外主流的三维GIS软件
2011-03-14 13:38:59我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方向之一。上世纪八十年代末以来,空间信息三维可视化技术成为业界研究的热点并以... -
三维游戏DirectX笔记
2020-10-27 13:47:48文章目录三维游戏DirectX笔记前言笔记第零章:绪论第一章:面向对象的游戏编程原理第二章:Windows编程基础第三章:DirectX简介第四章:基本空间变换第五章:基于顶点缓存的图形绘制第六章:融合技术第七章:光照与... -
三维重建开源软件介绍
2018-11-11 15:00:39先上一个招聘三维重建岗位的图,这个图上信息是我之前在招聘网上看到的,写的很详细,虽然我暂时做不到这些,但是可以描述一个方向,如果你想去三维重建公司工作,那么你应该具备一些什么技能 一、针对初学者 ... -
200728学习日报二维数组和字符数组
2020-07-28 22:36:39目录一、学习的知识点1、二维数组2、字符数组二、上课没有听懂或者没有理解的地方三、当天学习的收获四、作业的思路、不会的地方五、其他需要反馈的问题六、心得体会 一、学习的知识点 1、二维数组 //二维数组:地址... -
【Three.js】六(2)、three.js中的几何体——三维几何体
2019-09-14 20:15:18六(2)、three.js中的几何体——三维几何体一、BoxGeometry1.1 构造器参数说明二、ConeGeometry2.1 构造器参数说明三、CylinderGeometry3.1 构造器参数说明四、TetrahedronGeometry4.1 构造器参数说明五、... -
一文读懂三维基因组
2020-12-25 16:56:37文章目录一、细胞核 *Nucleus*二、染色质疆域 *Chromosome Territory,CT*三、染色质区室 *A/B compartments*四、拓扑结构域 *Topologically associating Domains,TAD*五、层关联域 *Lamina Associating Domains,... -
solidwork课件-幕墙三维模型制作
2012-07-26 10:31:12幕墙三维模型制作 solidwork课件 一:建立体块 二:建立网格 三:定义网格 四:定义面板 五:定义节点 六 :处理数据 七:输出文件 -
三维重建全流程,倾斜摄影测量
2014-10-25 01:02:11演示了基于图像的三维重建的五大关键技术,每个关键技术均以图像或者ply点云进行示意;原始重建图像共8张,由于图像分辨率较大未上传,同时对重建精度也做了一定约束,以减小数据量;并提供了一个基于OSG开发的... -
flink维表关联系列之Hbase维表关联:LRU策略
2020-06-30 01:45:39维表关联系列目录:一、维表服务与Flink异步IO二、Mysql维表关联:全量加载 三、Hbase维表关联:LRU策略 四、Redis维表关联:实时查询 五、kafka维表关联:广播方式 六、自定义异步查询 LRU LRU(Least Recently ... -
异步服务_Flink维表关联系列之维表服务与Flink异步IO
2021-01-12 00:50:27维表关联系列目录:一、维表服务与Flink异步IO二、Mysql维表关联:全量加载三、Hbase维表关联:LRU策略四、Redis维表关联:实时查询五、kafka维表关联:广播方式六、自定义异步查询一、维表服务维度或者是维表概念... -
三维重建实用算法 3D reconstruction(含代码)
2021-01-30 23:38:19三维重建实用算法总结一、KinectFusion二、Kintinuous和ElasticFusion三、ElasticReconstruction四、InfiniTAM五、DynamicFusion六、BundleFusion 本文来源于知乎 原文链接:... -
Android期末项目(一)—— 解析二维数组对象
2020-06-02 21:10:26Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) Android学习笔记(四)Android 中Activity页面的... -
膳食纤维
2020-12-16 00:53:50膳食纤维一、膳食指南二、不健康饮食和生活方式及其导致的问题三、黄金大便简单原则四、膳食纤维五、膳食纤维的分类六、膳食纤维的作用1.保护肠道健康2.其他作用①减轻体重②控制血糖③辅助降脂④预防肠癌七、不同... -
hbase 查询设置超时_flink维表关联系列之Hbase维表关联:LRU策略
2020-12-31 13:02:40点击蓝字关注~~维表关联系列目录:一、维表服务与Flink异步IO二、Mysql维表关联:全量加载三、Hbase维表关联:LRU策略四、Redis维表关联:实时查询五、kafka维表关联:广播方式六、自定义异步查询LRULRU(Least ... -
hbase 查询设置超时_Flink维表关联系列之Hbase维表关联:LRU策略
2020-12-31 13:02:38点击蓝字关注~~维表关联系列目录:一、维表服务与Flink异步IO二、Mysql维表关联:全量加载三、Hbase维表关联:LRU策略四、Redis维表关联:实时查询五、kafka维表关联:广播方式六、自定义异步查询LRULRU(Least ... -
3.一维数组
2020-03-13 17:58:24数组的定义二. 数组的初始化三. 数组的基本操作四. 操作数组的常见异常五. 获取数组最大元素六. 按格式打印数组元素七. 逆序排序八. 元素出现索引(第一次/最后一次) 一. 数组的定义 具有相同类型的若干变量按... -
【个人项目整理】机器人、三维模型
2019-05-12 18:19:56一、五轴舵机机器人 https://github.com/Jelatine/arm-robot-arduino 二、3D高达游戏 ...三、升级版六轴舵机机器人 四、三维建模软件 https://github.com/Jelatine/JellyCAD ...
-
谷粒商城-课件资料整理
-
MacOS实用技巧之Finder访达使用小技巧分享
-
springMVC工作流程
-
《文件过滤及内容编辑处理命令》
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
入党自我剖析 .doc
-
瓦片地图
-
计算机网络复习笔记,共85页,史上最全面
-
MySQL 索引
-
自传(材料5).doc
-
C#使用GDAL完成矢量数据导入到Postgis(核心代码)
-
2021-03-04
-
Vite2.0搭建Vue3.0应用实践
-
入党 党课心得3.pdf
-
264最小系统.PDF
-
思想汇报12月模板.pdf
-
思想汇报—端正入党动机(完).doc
-
Python函数库深度详解(1)
-
平台建设的7大问题:蚂蚁AI平台实践深度总结