RとCを使う改良版

  • RとCを使うときのファイル操作を、こちらのようにバイナリで行う
  • Cのスクリプト
    • バイナリファイルを書きだす
    • 変数Aを書きだす部分をループの外に出した
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define PI 3.1415926535

int main (int argc, char *argv[]){
	
	int Nx, Ny, Nz;
	int i,j,k;
	
	FILE *fp;
	
	Nx = atoi(argv[1]);
	Ny = atoi(argv[2]);
	Nz = atoi(argv[3]);
	
//	printf("argv = %d\n",atoi(argv[1]));
	
	double A[Nx][Ny][Nz];
	
	for (k = 0; k < Nz; k++) {
	for (j = 0; j < Ny; j++) {
	for (i = 0; i < Nx; i++) {
		
		A[i][j][k] = (i + 1)*(j + 1)*(k + 1)*1.0;
		
//		fp = fopen("Numbers.txt","a");
//		if(fp == NULL)return 1;
//		fprintf(fp,"%f\n",A[i][j][k]);
//		fclose(fp);
		
	}}}
	
	
	fp = fopen("Numbers.txt","wb");
	if(fp == NULL){
		printf("ファイル操作中にエラー");
		exit(1);
	}
	fwrite(A,sizeof(double),Nx*Ny*Nz,fp);
	fclose(fp);
	
	return 0;
}
# mat.R

library(rgl)

Nx <- as.numeric(commandArgs(trailingOnly = TRUE)[1])
Ny <- as.numeric(commandArgs(trailingOnly = TRUE)[2])
Nz <- as.numeric(commandArgs(trailingOnly = TRUE)[3])

# m <- data.matrix(read.table("Numbers.txt",header=FALSE,sep=""))
m <-readBin("Numbers.txt",double(),n=Nx*Ny*Nz,endian="little")

A<-array(m,c(Nx,Ny,Nz))

plot3d(slice.index(A,1),slice.index(A,2),slice.index(A,3),col=rainbow(256)[A/(max(A))*256+1],alpha=ifelse(A!=0,1,0))
rgl.viewpoint(theta=30,phi=30)
rgl.snapshot("Array.png")
#!/bin/sh

Nx=30
Ny=30
Nz=30

gcc -o mat mat.c
./mat $Nx $Ny $Nz

R --vanilla --slave --args < mat.R $Nx $Ny $Nz

open Array.png
# rm Numbers.txt