matlab实现
function eye_plot(A,vcm,VPH) A = A'; imagedata = diff(A); s=sum(sum(imagedata)); if s <0 imagedata = -imagedata; end c = imagedata; xx = find(c ~=0); if ~length(xx) > 1 ac = (diff(abs(c(xx))) == 0); ac1(2:length(ac)+1)=ac; ac1(1)=ac(1); pr = xx(union(find(ac==1),find(ac1==1))); imagedata(pr)=0; end ax = find(imagedata<0); az=ax(2:end-1); imagedata(az) = (imagedata(az-1)+imagedata(az)+imagedata(az+1))/3; imagedata(abs(imagedata)<10)=0; if max(imagedata)==0 img=imagedata; else img=255*imagedata/max(max(imagedata)); end my_fig=figure(); my_imag=image(img); empty=0; scope_colormap(empty); my_axes=get(my_fig,'CurrentAxes'); set(my_imag,'XData',[0 2]); set(my_imag,'YData',[2/3*vcm/1023*VPH -2/3*vcm/1023*VPH]); set(my_axes,'XLim',[0 2]); set(my_axes,'YLim',[2/3*vcm/1023*VPH -2/3*vcm/1023*VPH]); set(my_axes,'Ydir','normal'); set(my_axes,'Xdir','XGrid','on','Xcolor',[.25 .25 .25],'YGrid','on','Ycolor',[.25 .25 .25]); ylable('Volatage(V)'); xlabel('UI','color','k'); title('eye plot','fontweight','bold'); end
C语言实现
#include<stdio.h> #include<stdlib.h> #include<string.h>
typedef unsigned int u32; typedef struct POS{ int *p; int len; }POS;
typedef struct matrix{ int *data; int row; int cols; }mtx;
void display_matrix_(mtx *mtx) { int i,j; if(mtx->row < 0 || mtx->cols < 0) { printf("invalid para\n"); return ; }
if (mtx->row == 0 || mtx->cols == 0) { printf("[]\n"); return ; } for(i = 0; i < mtx->row; i++) { for(j = 0; j < mtx->cols; j++) { printf(" = ", *(mtx->data + i * mtx->cols +j)); } printf("\n"); } printf("\n"); }
void transpos_matrix_(mtx *dst, mtx *src) { int i,j; printf("A\n"); display_matrix_(src); for (i = 0; i < src->row; i++) for (j = 0; j < src->cols; j++) *(dst->data + j * src->row + i) = *(src->data + i*src->cols + j); printf("A'\n"); dst->row = src->cols; dst->cols = src->row; display_matrix_(dst); }
void diff_(mtx *dif, mtx *src) { int i; int j;
dif->cols = src->cols; dif->row = src->row - 1; for (i = 0; i < dif->row; i++) { for (j = 0; j < dif->cols; j++) { *(dif->data + i * dif->cols + j) = *((src->data + (i+1) * src->cols +j)) - *(src->data + i*src->cols + j); } } printf("diff(A')\n"); display_matrix_(dif); }
void Sum_(mtx *res, mtx *mtx) { int i; int j; int x; int y; *(res->data) = 0; x = mtx->row; y = mtx->cols; if (x == 1) { for(i = 0; i < y;i++) { *(res->data) += *(mtx->data + i); } res->cols = 1; res->row = 1; return; }else if(x > 1) { for(j = 0; j < y;j++) { for(i = 0; i < x; i++) *(res->data + j) += *(mtx->data + i*y +j); } res->cols = y; res->row = 1; return; } }
void oposite_(mtx *mtx) { int i; int j; int x; int y;
x = mtx->row; y = mtx->cols; for (i=0; i<x; i++) { for(j = 0; j < y; j++) *(mtx->data + i * y + j) = 0 -(*(mtx->data + i * y + j)); } display_matrix_(mtx); }
int find_(mtx *dst, mtx *src, char compare,int val) { int i; int j; int x; int y; int len = 0;
x = src->row; y = src->cols;
for(j = 0; j < y; j++) { for(i = 0; i < x; i++) { if (compare == '~') { //printf("src[%d][%d]:%d\n", i, j, *(src->data + i*y + j)); if(*(src->data + i*y + j) != val) { *(dst->data + len) = x*j+i; len += 1; } } else if(compare == '=') { if(*(src->data + i*y + j) == val) { *(dst->data + len) = x*j+i; len += 1; } } else if(compare == '>') { if(*(src->data + i*y +j) > val) { *(dst->data + len) = x*j+i; len += 1; } } else if(compare == '<') { if(*(src->data + i*y +j) < val) { *(dst->data + len) = x*j+i; len += 1; } } else { } dst->cols = len; dst->row = 1; } }
printf("find elements which are %c %d \n",compare,val); display_matrix_(dst); return 0; }
int length_(mtx *mtx) { int x; int y; x = mtx->row; y = mtx->cols; return (x>y)? x:y ; }
void replace_(mtx *mtx_, mtx *seq, int postval) { int i;
if (seq->row > 1) { printf("invalid para\n"); return; } for(i = 0; i < seq->cols; i++) { *(mtx_->data + (*(seq->data + i) / mtx_->row) + (*(seq->data + i) % mtx_->row) * (mtx_->cols)) = postval; } }
void abs_(mtx *abs_mtx, mtx *mtx) { int i; int j;
abs_mtx->row = mtx->row; abs_mtx->cols = mtx->cols;
for(i = 0; i < mtx->row; i++) { for(j = 0; j < mtx->cols; j++) { int tmp = *(mtx->data + i * mtx->cols + j); if (tmp < 0) { *(abs_mtx->data + i * abs_mtx->cols + j) = - *(mtx->data + i * mtx->cols + j); } else { *(abs_mtx->data + i * abs_mtx->cols + j) = *(mtx->data + i * mtx->cols + j); } } } }
void max_(mtx *logic_mtx, mtx *mtx) { int i; int j; int tmp;
if (mtx->cols == 0 || mtx->row == 0) return ; if (mtx->cols == 1 || mtx->row == 1) { tmp = *(mtx->data); for(i = 0; i < mtx->row * mtx->cols; i++) { if (tmp < *(mtx->data + i)) tmp = *(mtx->data + i); } *(logic_mtx->data) = tmp; logic_mtx->cols = 1; logic_mtx->row = 1; } else { for(i = 0; i < mtx->cols; i++) { tmp = *(mtx->data + i); for(j = 0; j < mtx->row; j++) { if (tmp < *(mtx->data + j * mtx->cols + i)) tmp = *(mtx->data + j * mtx->cols + i); } *(logic_mtx->data + i) = tmp; logic_mtx->cols = mtx->cols; logic_mtx->row = 1; } } }
void mul_(mtx *mul_mtx, mtx *mtx, int num) { int i;
for (i = 0; i < mtx->row * mtx->cols; i++) *(mul_mtx->data + i) = *(mtx->data + i) * num; mul_mtx->cols = mtx->cols; mul_mtx->row = mtx->row; }
void chu_(mtx *chu_mtx, mtx *mtx, int num) { int i;
for (i = 0; i < mtx->row * mtx->cols; i++) *(chu_mtx->data + i) = *(mtx->data + i) / num; chu_mtx->cols = mtx->cols; chu_mtx->row = mtx->row; }
int main(int argc, char **argv) { int i; int j; int ret; int k; int len; mtx src_mtx, dst_mtx, dif_mtx, sum_ret, ssum_ret; mtx c_mtx, xx_mtx, ax_mtx, az_mtx, abs_mtx, logic_mtx; int fd;
fd = open("eye_data",O_RDWR,0666); if(fd == -1) { perror("open"); return -1; } src_mtx.row = 6; src_mtx.cols = 8; src_mtx.data = malloc(src_mtx.row * src_mtx.cols * sizeof(int)); if (!src_mtx.data) { printf("malloc failed\n"); goto src_failed; }
read(fd, src_mtx.data, src_mtx.row * src_mtx.cols * sizeof(int));
dst_mtx.row = src_mtx.cols; dst_mtx.cols = src_mtx.row; dst_mtx.data = malloc(dst_mtx.row * dst_mtx.cols * sizeof(int)); if (!dst_mtx.data) { printf("malloc failed\n"); goto dst_failed; }
for(i = 0; i < src_mtx.row / 2; i++) for(j = 0; j < src_mtx.cols; j++) *(src_mtx.data + i * src_mtx.cols + j) = 20 * (i * src_mtx.cols + j); for(i = src_mtx.row / 2; i < src_mtx.row; i++) for(j = 0; j < src_mtx.cols; j++) *(src_mtx.data + i * src_mtx.cols + j) = 0 - 5 *(i * src_mtx.cols + j);
transpos_matrix_(&dst_mtx, &src_mtx); dif_mtx.data= malloc((dst_mtx.row - 1) * dst_mtx.cols * sizeof(int)); if (!dif_mtx.data) { printf("malloc failed\n"); goto dif_failed; } diff_(&dif_mtx, &dst_mtx);
sum_ret.data = malloc(dif_mtx.cols * 1 *sizeof(int)); if (!sum_ret.data) { printf("malloc failed\n"); goto sum_failed; } Sum_(&sum_ret, &dif_mtx); display_matrix_(&sum_ret); ssum_ret.data = malloc(sizeof(int)); if (!ssum_ret.data) { printf("malloc failed\n"); goto ssum_failed; } Sum_(&ssum_ret, &sum_ret); printf("ssum: %d\n", *(ssum_ret.data)); if (*(ssum_ret.data) < 0) oposite_(&dif_mtx);
c_mtx.row = dif_mtx.row; c_mtx.cols = dif_mtx.cols; c_mtx.data = malloc(c_mtx.row * c_mtx.cols * sizeof(int)); if (!c_mtx.data) { printf("malloc failed\n"); goto c_failed; } memcpy(c_mtx.data, dif_mtx.data, dif_mtx.row * dif_mtx.cols * sizeof(int)); printf("diff(A') == c_mtx:\n"); display_matrix_(&c_mtx); xx_mtx.data = malloc(c_mtx.row * c_mtx.cols * sizeof(int)); if (!xx_mtx.data) { printf("malloc failed\n"); goto xx_failed; } find_(&xx_mtx, &c_mtx, '~', 0);
/* if ~length(xx) > 1 ac = (diff(abs(c(xx))) == 0); ac1=(2:length(ac)+1)=ac ac1(1)=ac(1) pr=xx(union(find(ac==1),find(ac1==1))) imagedata(pr)=0 end */ if (!(length_(&xx_mtx) > 1)) { printf("=======\n"); //todo }
ax_mtx.data = malloc(dif_mtx.row * dif_mtx.cols * sizeof(int)); if (!ax_mtx.data) { printf("malloc failed\n"); goto ax_failed; } find_(&ax_mtx, &dif_mtx, '<', 0); if(ax_mtx.cols <= 2) return -1; az_mtx.cols = ax_mtx.cols - 2; az_mtx.row = 1; az_mtx.data = malloc(az_mtx.cols * 4); if (!az_mtx.data) { printf("malloc failed\n"); goto az_failed; } memcpy(az_mtx.data, ax_mtx.data + 1, (az_mtx.cols) * sizeof(int));
display_matrix_(&ax_mtx); display_matrix_(&az_mtx); display_matrix_(&dif_mtx); for(k = 0; k < az_mtx.cols; k++) { int x = dif_mtx.row; int y = dif_mtx.cols; int *p = az_mtx.data; int az = *(p + k);
*(dif_mtx.data + az / x + az % x * y) = ( *(dif_mtx.data + (az + 1) / x + (az + 1) % x * y) + *(dif_mtx.data + (az - 1) / x + (az - 1) % x * y) + *(dif_mtx.data + az / x + az % x * y) )/3 ; } printf("dif\n"); display_matrix_(&dif_mtx);
abs_mtx.data = malloc(dif_mtx.cols * dif_mtx.row * sizeof(int)); if (!abs_mtx.data) { printf("malloc failed\n"); goto abs_failed; } abs_(&abs_mtx,&dif_mtx); printf("abs(dif)\n"); display_matrix_(&abs_mtx); find_(&xx_mtx, &abs_mtx, '<', 10); printf("prev dif\n"); display_matrix_(&dif_mtx); replace_(&dif_mtx, &xx_mtx, 0); printf("post dif\n"); display_matrix_(&dif_mtx);
logic_mtx.data = malloc(dif_mtx.cols*sizeof(int)); if (!logic_mtx.data) { printf("malloc failed\n"); goto logic_failed; } max_(&logic_mtx,&dif_mtx); if (logic_mtx.data == 0) {
} else { int tmp; printf("max(dif_mtx)\n"); display_matrix_(&logic_mtx); max_(&logic_mtx,&logic_mtx); printf("max(max(dif_mtx))\n"); display_matrix_(&logic_mtx); tmp = *(logic_mtx.data); printf("tmp:%d\n",tmp); display_matrix_(&logic_mtx); mul_(&dif_mtx,&dif_mtx,255); display_matrix_(&dif_mtx); chu_(&dif_mtx,&dif_mtx,tmp); display_matrix_(&dif_mtx); }
//mtx src_mtx, dst_mtx, dif_mtx, sum_ret, ssum_ret; //mtx c_mtx, xx_mtx, ax_mtx, az_mtx, abs_mtx, logic_mtx; free(logic_mtx.data); logic_failed: free(abs_mtx.data); abs_failed: free(az_mtx.data); az_failed: free(ax_mtx.data); ax_failed: free(xx_mtx.data); xx_failed: free(c_mtx.data); c_failed: free(ssum_ret.data); ssum_failed: free(sum_ret.data); sum_failed: free(dif_mtx.data); dif_failed: free(dst_mtx.data); dst_failed: free(src_mtx.data); src_failed: close(fd); return 0; }
源码链接:https://pan.baidu.com/s/1K_jkevrYby_6iNJ9HN8upQ 提取码:eg0v